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



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

脚本当前的作用:

  • 在编辑时,功能"CRMarchive"检查工作表A的第26列,如果编辑的单元格包含"是",则复制整行并将其粘贴到工作表B,然后从工作表A中删除行。
  • 同样在编辑时,另一个函数"排序"将根据第 3 列中的日期对工作表 B 进行排序,最新的在前。

我需要脚本做什么:

  • 函数"CRMarchive"执行相同的操作,但在午夜以及工作表 A 上第 26 列中具有"是">的任何行。
  • 然后,函数"排序"对工作表 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);
}
}

提前感谢!

要从 onEdit 太时间驱动的触发器调整您的 CRMarchive 函数,您需要执行以下更改:

  1. 而不是检索活动工作表,而是使用 getSheets(( 检索电子表格的所有工作表并遍历它们(在您的情况下,您希望循环到第 6 张工作表(
  2. 而不是检索 activeRange,而是检索整个数据范围并遍历每一行,使用 getCell 检索该范围的各个单元格
  3. 无需验证活动列是否为 26 - 只需直接检索第 26 列中所有单元格的值
  4. 无需复制粘贴行
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语句中 - 使用 switch 语句检索感兴趣的工作表,并使其他请求对所有工作表通用

  1. 修改代码后,按照此处的说明,将时间驱动的触发器转换为时间驱动的触发器

样本:

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);         
}
}
}
}``

最新更新