我正在尝试在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块的第一行遇到错误并循环,直到它超时。我很不知道该怎么做。我很感激任何帮助,谢谢!
答案 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错误。