【问题标题】:Time-driven Triggered Google Script to move Spreadsheet rows that meeting certain conditions时间驱动触发谷歌脚本移动满足特定条件的电子表格行
【发布时间】:2015-10-29 04:17:36
【问题描述】:

我目前有这个 Google 脚本,想让它每 12 小时运行一次,但时间驱动的触发器设置不起作用:

 function binIT() {

   var sheetOrg = "1stSheet";
   var columnNum = 4;
   var value1 = "DONE";
   var value2 = "Removed";
   var sheetBin = "2ndSheet";

   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = SpreadsheetApp.getActiveSheet();
   var range = sheet.getActiveCell();

   if (sheet.getName() == sheetOrg && range.getColumn() == columnNum && range.getValue() == value1) {
     var targetSheet = ss.getSheetByName(sheetBin);
     var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
     sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
     sheet.deleteRow(range.getRow());
   }

   if (sheet.getName() == sheetOrg && range.getColumn() == columnNum && range.getValue() == value2) {
     var targetSheet = ss.getSheetByName(sheetBin);
     var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
     sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
     sheet.deleteRow(range.getRow());
   }

 }

这是我一段时间后收到的电子邮件:

*您的脚本 Makro 测试最近未能完成 成功地。 故障摘要如下所示。配置 此脚本的触发器,或更改您的接收设置 未来的故障通知,请单击此处。

脚本由 记录事件发现。

总结:

错误消息计数

错误值(第 6 行, 文件“代码”)2

详情:

开始函数错误信息触发结束

10/28/15 5:22 PM BinIT 错误值(第 6 行,文件 “代码”)基于时间的 10/28/15 5:22 PM

2015 年 10 月 28 日下午 5:23 BinIT 错误值 (第 6 行,文件“代码”)基于时间的 10/28/15 5:23 PM

此致,

谷歌

Apps 脚本需要帮助吗?请访问 Google Apps 脚本文档。

请不要回复此消息。 (c) 2015 年谷歌*

我注意到在我拥有的脚本中,它似乎将活动单元格作为范围,因此时间触发器不起作用。但是我不知道如何扫描整个列并获得价值

我的 Java 知识几乎没有,所以如果这是一个愚蠢的问题,我深表歉意。但我真的需要让它适用于我的谷歌电子表格,所以我非常感谢你的帮助。

如果您需要更多详细信息,请告诉我。

非常感谢和问候,

名字

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    正如已经建议的那样,您不能在时间驱动的触发器上使用 getActiveRange() 和 getActiveSheet()。而是尝试这样的事情(在您的数据副本上,因为它尚未经过测试)。不要忘记在 var ss 中填写您的电子表格 ID...

    function binIT() {
    var ss = SpreadsheetApp.openById('YOUR_SPREADSHEETID_HERE'),
        sheetOrg = ss.getSheetByName("1stSheet"),
        sheetBin = ss.getSheetByName("2ndSheet"),
        valuesToCheck = ["DONE", "Removed"],
        arr = [], 
        values = sheetOrg.getDataRange().getValues(),
        i = values.length;
    while (--i) {
    if (valuesToCheck.indexOf(values[i][3]) > -1) {
            arr.unshift(values[i])
           sheetOrg.deleteRow(i + 1) 
         }
       }
    sheetBin.getRange(sheetBin.getLastRow()+1, 1, arr.length, arr[0].length).setValues(arr);
    }
    

    【讨论】:

    • 完美运行。非常感谢@JPV。只是一个简单的问题,您在哪里定义列?这里是 indexOf(values[i][3]) 的这一部分吗?它说 3 但实际上正在检查 D 列
    • JS 中的数组是零索引的。因此,电子表格中的第一列将位于 JS 数组中的索引 0 处。
    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多