Google apps script 如何减少谷歌应用程序脚本服务调用
此处的脚本使用A1中的值重命名sheetnames。我管理的学校数据库有150多张。脚本正在抛出最长时间执行超时错误。我在这里的论坛上读到,你可以减少服务电话。这看起来像是一个解决办法,但在我的生活中,我不能把我的头围绕在发生的事情上 我可能应该提到,我是一个彻头彻尾的傻瓜,你的帮助将是巨大的帮助Google apps script 如何减少谷歌应用程序脚本服务调用,google-apps-script,google-sheets,Google Apps Script,Google Sheets,此处的脚本使用A1中的值重命名sheetnames。我管理的学校数据库有150多张。脚本正在抛出最长时间执行超时错误。我在这里的论坛上读到,你可以减少服务电话。这看起来像是一个解决办法,但在我的生活中,我不能把我的头围绕在发生的事情上 我可能应该提到,我是一个彻头彻尾的傻瓜,你的帮助将是巨大的帮助 function onEdit() { var ss = SpreadsheetApp.getActive(); var allsheets = ss.getSheets(); // Array h
function onEdit() {
var ss = SpreadsheetApp.getActive();
var allsheets = ss.getSheets();
// Array holding the names of the sheets to exclude from the execution
var exclude ="Sheet1","Sheet2","Sheet3","Article","Frontpage","Logos","Sheet4","Sheet5","Sheet6","Sheet10"];
for(var s=10;s<allsheets.length;s++) {
var sheet = allsheets[s];
var oldName = sheet.getName();
var newName = sheet.getRange(1,1).getValue();
if (newName.toString().length>0 && newName !== oldName) {
sheet.setName(newName);
// Stop iteration execution if the condition is meet.
if(exclude.indexOf(sheet.getName())==-1) continue;
}
} // end of loop
} // end of function
首先,去掉不必要的调用——你是否考虑过<代码>剪接(<)/代码>我对上一个问题的回答?
allsheets.splice(0,10); //0-based start and end indexes;
如果在任何地方都可能遇到被排除的工作表名称,请保留exclude
数组和If
语句(顺便说一句,您的示例中似乎有输入错误-数组声明缺少一个左括号)
无论您如何排除前10个工作表,当您调用getName()
methodallsheets.length
次(因此,150个不必要的方法调用)时,停止迭代的调用都会变得过于繁琐-改为引用newName
变量
通过在调用setName()
方法之前检查条件,可以进一步减少调用(假设新名称位于exclude
数组中,则不想执行任何操作)
然后,使用for
循环执行相同的操作(注意,如果使用splice()
对数组进行过滤,则索引s
应为0
):
你能不能把你的处决记录写进去,这样我们就可以知道什么花费了最多的时间?这可以通过运行脚本,然后转到View>Execution transcript
.Hi,[19-05-28 08:12:42:455 PDT]Range.getValue()[2.157秒]
来查看。有很多这样的问题,所以我不想在这里发布整个日志,因为这只是重复。这个答案假设您想排除前十张表的名称,不是提供的数组中的十张纸名称-从你的答案判断,我可能错了,请让我知道如果是这种情况,我将根据情况更新答案以防万一,更新答案为独立于解决方案,将继续查找是否可以进一步优化。关于缺少的括号,这是一个打字错误。我正在测试排除前10张的两个选项。它们与我在那里列出的相同,因此我应该删除列表,让脚本检查前10个并排除它们。嗨,Oleg,当我运行上面的脚本ReferenceError时出现此错误:“allsheets”未定义。(第1行,文件“代码”)
Hi!您应该仅在将工作表写入allsheets
变量后调用此方法(如果我们在这里讨论的是splice()
),从错误判断,您尝试在第一行全局调用它,而您应该在调用ss.getSheets()
allsheets.splice(0,10); //0-based start and end indexes;
for(var s=10; s<allsheets.length; s++) {
var sheet = allsheets[s];
var oldName = sheet.getName();
var newName = sheet.getRange(1,1).getValue();
//this reduces setName() calls if you don't need to set reserved names;
if(exclude.indexOf(newName)!==-1) { continue; }
if (newName.toString().length>0 && newName !== oldName) {
sheet.setName(newName);
}
}
function testArray() {
var ss = SpreadsheetApp.getActive();
var arr = ss.getSheets();
arr.splice(0,10); //removes first 10 Sheets from Array;
var exclude = []; //fill with unchangeable names;
arr.forEach(function (sheet,index) { //iterates over Array of Sheets;
var oldName = sheet.getName();
var newName = sheet.getRange(1,1).getValue();
if(newName.toString().length>0 && newName!==oldName) {
//Move to next iteration if new name should be excluded;
if(exclude.indexOf(newName)===-1) {
sheet.setName(newName); //set name otherwise;
}
}
}); // end of loop
} // end of function