【问题标题】:Google AppScript to move row when date is enteredGoogle Apps脚本在输入日期时移动行
【发布时间】:2020-05-07 17:48:55
【问题描述】:

我有一个 Google 表格,其中有一个复选框列 (26) 和一个日期列 (27)。有两个活动脚本会影响此选项卡。

  1. 单击复选框 (26) 时,我有一个脚本可以自动添加日期 (27)。
  2. 单击复选框 (26) 时,我有一个脚本可以将该行移动到另一个选项卡。

我遇到的问题是,有时在添加日期之前行已移动。 (下面粘贴的脚本)

如何更改脚本 #2,以便在将任何日期添加到 Col 27 时而不是在 Col 26 中单击复选框时移动该行?

非常感谢任何帮助:

function onEdit(event) {
  // assumes source data in sheet named main
  // target sheet of move to named Completed
  // getColumn with check-boxes is currently set to colu 26 or 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "APPROVAL QUEUE" && r.getColumn() == 26 && r.getValue() == true) {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("COMPLETED ORDERS");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
}

【问题讨论】:

  • 有什么问题?
  • 是否可以将两个脚本结合起来并在同一个脚本中添加日期和移动?

标签: google-apps-script


【解决方案1】:

如何使这个函数不是 onEdit 函数,而是常规函数。 然后在放入日期的 onEdit 脚本中调用此函数。这样它就完成了日期的输入,然后运行脚本来移动该行数据。您甚至可以放置一个 Utilities.sleep(1000) (1000 微秒是一秒)来延迟脚本移动行。

【讨论】:

  • 抱歉,我对这个太基础了 - 但我应该在上面的代码中插入 Utilities.sleep(1000)
  • 如果你重命名函数,例如'function moveRow()',你可以把它放在你的onEdit脚本的最后,用来填写日期。喜欢..... Utilities.sleep(1000); moveRow .... }
【解决方案2】:

一个项目中不允许有两个简单的onEdit触发器

  1. 需要将两个脚本的代码合并为一二,避免冲突行为
  2. 为了避免在插入日期之前复制行 - 使用SpreadsheetApp.flush()

示例如何将两个功能合二为一:

function onEdit(event) {
  // assumes source data in sheet named main
  // target sheet of move to named Completed
  // getColumn with check-boxes is currently set to colu 26 or 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  if(s.getName() == "APPROVAL QUEUE" && r.getColumn() == 26 && r.getValue() == true) {
    s.getRange(row, 27).setValue(new Date());
    SpreadsheetApp.flush();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("COMPLETED ORDERS");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    //the following line is not necessary since you moved rather than copied that range
    s.deleteRow(row);
  }
}

【讨论】:

  • 非常感谢您将它们放在一起,用这个替换旧脚本并禁用时间戳脚本。不幸的是,当我尝试运行它时,什么也没发生(行没有移动,时间戳也没有添加)。
  • 您是手动运行还是由编辑触发?我建议您进行故障排除以在 if 语句的外部和内部实现日志。您可以在View->Executions 下查看它们以了解问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多