Javascript 将onEdit函数更改为计时器触发器

Javascript 将onEdit函数更改为计时器触发器,javascript,google-apps-script,triggers,Javascript,Google Apps Script,Triggers,我继承了一些工作表,脚本编写超出了我的理解范围,不幸的是,我的研究没有给我答案!我需要一个脚本在每晚午夜运行,而不是使用onEdit触发器。这也意味着脚本将需要查找满足要求的所有条目,而不仅仅是上次编辑的条目 脚本当前执行的操作: 编辑时,函数“CRMarchive”检查工作表A的第26列,如果编辑的单元格包含“是”,则复制整行并将其粘贴到工作表B,然后从工作表A中删除该行 同样在编辑时,另一个功能“排序”将根据第3列“最新优先”中的日期订购工作表B 我需要脚本执行的操作: 函数“CRMa

我继承了一些工作表,脚本编写超出了我的理解范围,不幸的是,我的研究没有给我答案!我需要一个脚本在每晚午夜运行,而不是使用onEdit触发器。这也意味着脚本将需要查找满足要求的所有条目,而不仅仅是上次编辑的条目

脚本当前执行的操作:

  • 编辑时,函数“CRMarchive”检查工作表A的第26列,如果编辑的单元格包含“是”,则复制整行并将其粘贴到工作表B,然后从工作表A中删除该行
  • 同样在编辑时,另一个功能“排序”将根据第3列“最新优先”中的日期订购工作表B
我需要脚本执行的操作:

  • 函数“CRMarchive”执行相同的操作,但在午夜以及工作表A上第26列中有“是”的任何行
  • 函数“Sort”然后对表B中的所有条目进行排序
我已经发现,是活动表/范围位不允许我使用基于时间的触发器,但我的混乱只能产生有限的成功,也就是说,我可以通过手动触发脚本使其移动一行,以满足条件,但仅此而已

function CRMarchive(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getActiveSheet();
  var r = s.getActiveRange();

  if(s.getName() == "Promotions/Retain" && r.getColumn() == 26 && r.getValues() == "Yes") {
    var row = r.getRow();
    var numColumns = "25"
    var targetSheet = ss.getSheetByName("Archive - Promotions/Retain");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row); 
  }
 if(s.getName() == "Dev+Save/Int/Welc+Nurture" && r.getColumn() == 26 && r.getValue() == "Yes") {
    var row = r.getRow();
    var numColumns = "25"
    var targetSheet = ss.getSheetByName("Archive - Dev+Save/Int/Welc+Nurture");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
 if(s.getName() == "Reactivation" && r.getColumn() == 26 && r.getValue() == "Yes") {
    var row = r.getRow();
    var numColumns = "25"
    var targetSheet = ss.getSheetByName("Archive - Reactivation");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
 if(s.getName() == "Conversions" && r.getColumn() == 26 && r.getValue() == "Yes") {
    var row = r.getRow();
    var numColumns = "25"
    var targetSheet = ss.getSheetByName("Archive - Conversions");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
 if(s.getName() == "VIP" && r.getColumn() == 26 && r.getValue() == "Yes") {
    var row = r.getRow();
    var numColumns = "25"
    var targetSheet = ss.getSheetByName("Archive - VIP");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }  
 if(s.getName() == "Service" && r.getColumn() == 26 && r.getValue() == "Yes") {
    var row = r.getRow();
    var numColumns = "25"
    var targetSheet = ss.getSheetByName("Archive - Service");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
}
提前谢谢

要从OneEdit To time driven trigger调整CRMarchive函数,您需要执行以下更改:
  • 与其检索活动工作表,不如使用电子表格的所有工作表进行检索并在其中循环(在您的情况下,您希望循环到第6个工作表)
  • 不要检索activeRange,而是检索整行并循环每行,使用
  • 与其验证活动列是否为26,不如直接检索列26中所有单元格的值
  • 不需要复制粘贴行

  • 你能显示函数Sort()的代码吗?你知道如何将时间驱动触发器绑定到你的代码中,只是不知道如何修改代码吗?嗨!我在这里为上下文制作了一个空白副本:我知道如何在触发器菜单中创建时间触发器,以及如何在实际代码中创建触发器。这太棒了,谢谢!我每天都在学习,这真的很有帮助。我很快就要让它工作了,第8行出现了一个明显的障碍——“单元格引用超出范围”。我制作了一份空白副本,以便在这里上下文中看到:我真的非常感谢所有的帮助-我需要尽快让它工作,但经过3天的学习/尝试和错误,我仍然无法理解:(我要补充的是,我不是在找人来修复我的脚本,所以如果遇到这种情况,我很抱歉。我接受了上面的所有内容,但是var I和var j位让我困惑-这些位到底在做什么?首先:我的代码有一个拼写错误,应该是
    r.getCell(j+1,26)
    而不是
    i+1
    -对此很抱歉。但您的问题是,并非所有工作表都有Z列,实际上您只想从电子表格中看到的前6张工作表中循环。在这种情况下,您应该使用计数器变量
    i
    循环到6。我更新了我的代码。重要的删除吗所有空行-它们可能会让你的代码慢得多。啊,我太接近了!我尝试了从I到j的更改,并尝试了在归档表中添加一列Z,但不是同时添加两列。唯一的问题是,它似乎在3-4次后停止循环,所以如果有5+个“是”条目然而,这并不能让所有人都明白!我想这是我自己想要解决的问题,而且我现在可以将它设置为每小时一次。我真的非常感谢你。我将重新学习我的谷歌脚本/Java脚本,但这给了我一个真正的开始! var row = r.getRow(); var numColumns = "25" var targetSheet = ss.getSheetByName("Archive - Promotions/Retain"); var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); s.getRange(row, 1, 1, numColumns).moveTo(target); s.deleteRow(row);
    function CRMarchive(){
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheets = ss.getSheets();
      for (var i = 0; i < 6; i++){
        var s = sheets[i];
        var r = s.getDataRange();
        for (var j = 0; j < r.getLastRow(); j++){
          Logger.log(r.getCell(j+1, 26).getA1Notation());
          if(r.getCell(j+1, 26).getValue() == "Yes") {
            var row = r.getCell(j+1, 26).getRow();
            var numColumns = "25";
            switch(s.getName()) {
              case "Promotions/Retain":
                var targetSheet = ss.getSheetByName("Archive - Promotions/Retain");
                break;
              case "Dev+Save/Int/Welc+Nurture":
                var targetSheet = ss.getSheetByName("Archive - Dev+Save/Int/Welc+Nurture");
                break;
              case "Reactivation":
                var targetSheet = ss.getSheetByName("Archive - Reactivation");
                break;
              case "Conversions":
                var targetSheet = ss.getSheetByName("Archive - Conversions");
                break;
              case "VIP":
                var targetSheet = ss.getSheetByName("Archive - VIP");
              case "Service":  
                break;            
                var targetSheet = ss.getSheetByName("Archive - Service");
                break;
            }        
            var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
            s.getRange(row, 1, 1, numColumns).moveTo(target);
            s.deleteRow(row);         
          }
        }
      }
    }``