【问题标题】:Check if in cell Today's date then continue检查单元格中是否为今天的日期,然后继续
【发布时间】:2021-02-27 17:07:04
【问题描述】:

我在 Internet 上找到了一个脚本,并正在尝试对其进行一些修改以满足我的需要。但是偶然发现了一个问题。该脚本从下拉菜单中获取书签列表,如果您在下一个单元格中写入“确定”,则它将该行传输到选定的书签。我想确认今天的日期。

工作表的副本。这里也有些不同。

var actionCol = 7; var nameCol = 6;

https://docs.google.com/spreadsheets/d/1P9avWP8i5Z4KA4zt3EoUZNbgMKeXwnOYKsgCG2_vSLE/edit?usp=sharing

/**
 * Moves row of data to another spreadsheet based on criteria in column 6 to sheet with same name as the value in column 4.
*/
 
function onEdit(e) {
  // see Sheet event objects docs
  // https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
  var ss = e.source;
  var s = e.range.getSheet();
  var r = e.range;
  
  // to let you modify where the action and move columns are in the form responses sheet
  var actionCol = 10;
  var nameCol = 9;
 
  // Get the row and column of the active cell.
  var rowIndex = r.getRowIndex();
  var colIndex = r.getColumnIndex();
   
  // Get the number of columns in the active sheet.
  // -1 to drop our action/status column
  var colNumber = s.getLastColumn()-1;
   
  // if our action/status col is changed to ok do stuff
  if (e.value == "ok" && colIndex == actionCol) {
    // get our target sheet name - in this example we are using the priority column
    var targetSheet = s.getRange(rowIndex, nameCol).getValue();
    // if the sheet exists do more stuff
    if (ss.getSheetByName(targetSheet)) { 
      // set our target sheet and target range
      var targetSheet = ss.getSheetByName(targetSheet);
      var targetRange = targetSheet.getRange(targetSheet.getLastRow()+1, 1, 1, colNumber);
      // get our source range/row
      var sourceRange = s.getRange(rowIndex, 1, 1, colNumber);
      // new sheets says: 'Cannot cut from form data. Use copy instead.' 
      sourceRange.copyTo(targetRange);
      // ..but we can still delete the row after
      s.deleteRow(rowIndex);
      // or you might want to keep but note move e.g. r.setValue("moved");
    }
  }
}

【问题讨论】:

  • But stumbled upon a problem. 你能说得更具体点吗?你有什么错误吗?实际结果与您期望的结果有何不同?您能否提供一份您正在处理的电子表格的副本,说明这种差异?

标签: google-apps-script


【解决方案1】:

如果我理解正确,您想在以下情况下剪切并粘贴已编辑的行:

  1. 编辑的列是G,值为今天对应的Date。
  2. F 列中对应的名称指的是现有工作表的名称。

为了检查这两个日期是否对应同一天,您可以比较getDate()getMonth()getFullYear() 返回的值,如在此函数中(感谢Pointy):

function sameDay(d1, d2) {
  return d1.getFullYear() === d2.getFullYear() &&
         d1.getMonth() === d2.getMonth() &&
         d1.getDate() === d2.getDate();
}

然后,您可以在 main 函数中调用它:

function onEdit(e) {
  var ss = e.source;
  var s = e.range.getSheet();
  var r = e.range;
  var value = r.getValue();
  var actionCol = 7;
  var nameCol = 6;
  var rowIndex = r.getRow();
  var colIndex = r.getColumn();
  var colNumber = s.getLastColumn();
  if (value instanceof Date && colIndex == actionCol) {
    var today = new Date();
    if (sameDay(value, today)) {
      var targetSheetName = s.getRange(rowIndex, nameCol).getValue();
      var targetSheet = ss.getSheetByName(targetSheetName);
      if (targetSheet) {
        var sourceRange = s.getRange(rowIndex, 1, 1, colNumber);
        var targetRange = targetSheet.getRange(targetSheet.getLastRow()+1, 1);
        sourceRange.copyTo(targetRange);
        s.deleteRow(rowIndex);
      } 
    }
  }
}

【讨论】:

  • 现在该功能的工作方式是,如果在“F”列中选择了选项卡,并且“G”列更改为“ok”,则该行被转移。我想更改,以便在“G”列中的“ok”位置显示日期,如果是今天的日期,则进行复制。从逻辑上讲,我了解一切是如何进行的,但在这里我必须自己写一些疯狂的问题。未给出:D 非常感谢您。
  • @UnrealHA 该脚本已经在检查是否是今天的日期,即使ok 没有更改为日期。您的意思是要将C 中的日期复制到G,然后将日期与今天的日期进行比较,如果匹配,则将该行移动到目标工作表?
  • 而不是“OK”写入日期,然后检查是否是今天的日期然后复制。
  • @UnrealHA 所以如果今天的日期被写入G,你想复制数据,忽略C。为了做到这一点,我编辑了我的答案,包括代码 sn-p。让我知道这是否适合您。
  • 我明白我的问题出在哪里。太感谢了。一切都很好。
【解决方案2】:

试试这个方法:

function onEdit(e) {
  var ss = e.source;
  var s = e.range.getSheet();
  var r = e.range;
  var actionCol = 10;
  var nameCol = 9;
  var rowIndex = r.rowStart;
  var colIndex = r.columnStart;
  var colNumber = s.getLastColumn()-1;
  const dt=new Date(e.range.offset(0,n));//you add the column offset 
  const dtv=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate()).valueOf();
  const td=new Date();
  const tdv=new Date(td.getFullYear(),td.getMonth(),td.getDate()).valueOf();
  if (e.value == "ok" && colIndex == actionCol && dtv==tdv) {
    var targetSheet = s.getRange(rowIndex, nameCol).getValue();
    var tSh = ss.getSheetByName(targetSheet);
    if (tSh) { 
      var targetRange = tSh.getRange(tSh.getLastRow()+1, 1, 1, colNumber);
      var sourceRange = s.getRange(rowIndex, 1, 1, colNumber);
      sourceRange.copyTo(targetRange);
      s.deleteRow(rowIndex);
    }
  }
}

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 2018-04-05
    相关资源
    最近更新 更多