应用程序脚本onedit触发过快导致代码与自身冲突

时间:2018-04-09 05:06:33

标签: google-apps-script google-sheets

我正在尝试在Google Spreadsheets和Apps脚本中创建一个applet,用于搜索有关用户搜索的YouTube视频的视图数据。当用户键入搜索查询时,应从模板表复制新工作表并将其自定义为查询。我遇到的问题是,当用户连续快速输入多个查询时,脚本会转储模板表的多个副本,并将其命名为“模板1的副本”,“模板2的副本”等,而每张表的名称应为“KW:”+其关联的关键字。我怀疑这是因为该函数重复并重命名了一个工作表,但是如果一个函数的两个或多个实例几乎同时尝试这个,它们会针对同一个工作表,从而导致错误。

这是我尝试过的结果:

function main(e){
  //spreadsheet=SpreadsheetApp.getActiveSpreadsheet() at the top of the function
  //keyword=the string the user typed in
  //...
  while(true){
    var random=Math.random().toString();
    try{
      //assign the template sheet a random name other processes will fail when they try to use it
      spreadsheet.getSheetByName('template').setName(random);
      //make a copy of the template
      spreadsheet.getSheetByName(random).copyTo(spreadsheet);
      //give the copy a proper name
      spreadsheet.getSheetByName('Copy of '+random).setName("KW: "+keyword);
      //reset the name of the template so other processes can use it
      spreadsheet.getSheetByName(random).setName('template');
      break;
    }
    //when a process fails, it should wait then try again
    catch(e){Utilities.sleep(Math.round(random*250));}
  //...
}

main在编辑时设置了触发器。上面的代码可以防止出现任何“模板n的复制”表,但它只会遗漏掉应该生成的大多数工作表。我的猜测是代码在try块的第一行遇到错误并循环,直到它超时。我很不知道该怎么做。我很感激任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

首先尝试复制模板表,然后更改新表的名称。您的解决方案会因为您正在修改模板表而遇到错误,但您应该真的避免这样做。使用这种方法,您永远不会修改模板表。

function main(e){
  //spreadsheet=SpreadsheetApp.getActiveSpreadsheet() at the top of the function
  //keyword=the string the user typed in
  //...
  while(true){ 
    try{
      // Select the template sheet
      var templateSheet = spreadsheet.getSheetByName("template");
      // Set the new sheet name
      var sheetName = "KW: "+keyword;
      // Copy the template sheet and set name
      var newSheet = templateSheet.copyTo(spreadsheet).setName(sheetName);
      break;
    }
    //when a process fails, it should wait then try again
    catch(e){Utilities.sleep(Math.round(random*250));}
    //...
  }
}

虽然我并不完全了解您对脚本所做的事情,但我对您的方法有一些主要的顾虑。我不认为你应该为每个查询创建一个新工作表。首先,这将使您的数据真正难以汇总。其次,由于工作表名称必须是唯一的,因此只要有人搜索已有现有工作表的内容,您的功能就会陷入您设置的无限while循环中。

我不知道您在工作表中放置了哪种数据,但您应该考虑尝试在一张纸上记录数据。此外,尽管您的while循环有效,并且在出现错误的情况下最终会被Google's script limitations终止,您应该尝试(1)实现更强大的功能,例如在工作表名称后附加数字和(2)正确logging错误。