Javascript Google应用程序脚本超出了执行时间限制
我有一个几乎160个子表谷歌表。所有问题都在“全部”表中,B列是实际的电子表格名称,它们应该在哪里。下面的代码从“所有”电子表格中读取数据,并将它们完美地发送到所需电子表格的最后一行,但这需要很长时间!可能是因为它有很多子表,并且一次又一次地使用getSheetByName。现在,我已将所有子图纸的名称和ID同时存储在“图纸”和“图纸ID”数组中。我正在考虑比较Javascript Google应用程序脚本超出了执行时间限制,javascript,for-loop,google-apps-script,optimization,google-sheets,Javascript,For Loop,Google Apps Script,Optimization,Google Sheets,我有一个几乎160个子表谷歌表。所有问题都在“全部”表中,B列是实际的电子表格名称,它们应该在哪里。下面的代码从“所有”电子表格中读取数据,并将它们完美地发送到所需电子表格的最后一行,但这需要很长时间!可能是因为它有很多子表,并且一次又一次地使用getSheetByName。现在,我已将所有子图纸的名称和ID同时存储在“图纸”和“图纸ID”数组中。我正在考虑比较rangeValues[j][1]和sheetNames[k][0]。下面是电子表格的代码和屏幕截图 这样合适吗?请帮助我更快地运行脚本
rangeValues[j][1]
和sheetNames[k][0]
。下面是电子表格的代码和屏幕截图
这样合适吗?请帮助我更快地运行脚本
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName(“全部”);
var rangeData=sheet.getDataRange();
var lastRow=rangeData.getLastRow();
var searchRange=sheet.getRange(1,1,最后一行,8);
var货币表;
函数send(){
var rangeValues=searchRange.getValues();
var sheetNames=新数组();
var sheets=SpreadsheetApp.getActiveSpreadsheet().getSheets();
对于(var i=0;i尝试以下方法:
应该快很多
function send() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName("All");
var rg=sh.getRange(1,1,sh.getLastRow(),8);
var v=rg.getValues();
var names=[];
var sheets=ss.getSheets();
sheets.forEach(function(sh,i){names.push(sh.getName());});
v.forEach(function(r){
let idx=names.indexOf(r[1]);//column2
if(idx!=-1) {
sheets[idx].getRange(sheets[idx].getLastRow()+1,1,1,8).setValues([r]);
}
});
}
我相信你的目标如下
- 您希望降低脚本的处理成本
修改点:
- 在类电子表格中没有
getSheetByID
方法。这样,我认为在您的情况下,可以删除以下脚本
var sheetID = new Array();
var sheetIDs = SpreadsheetApp.getActiveSpreadsheet().getSheets();
for (var i=0 ; i<sheetIDs.length ; i++) sheetID.push( [ sheetIDs[i].getSheetId() ] );
注:
- 在这种情况下,当您运行脚本时,将使用一个API调用。因为使用了spreadsheets.values.batchUpdate方法
- 在我的环境中,当我使用示例电子表格测试上述脚本和您的脚本时,我可以确认您的脚本将流程成本降低了约70%
参考资料:
我不明白你做了什么,但它工作得很好,而不是70%,可能已经降低了90%的流程成本!你是我的天使。@Imtiaz感谢你的回答。我很高兴你的问题得到了解决。根据你的情况,降低流程成本有2点。1.当每行放在同一张表上时,值为pu2.当这些值被放到每个表中时,这些值通过一个API调用被放到每个表中。为了实现这一点,我建议使用Sheets API。
function send() {
// 1. Retrieve Spreadsheet and values. This script is from your script.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("All");
var rangeData = sheet.getDataRange();
var lastRow = rangeData.getLastRow();
var searchRange = sheet.getRange(1,1, lastRow, 8);
var curr_sheet;
var rangeValues = searchRange.getValues();
// 2. Retrieve all sheets in the Spreadsheet.
var sheets = ss.getSheets().reduce((o, e) => Object.assign(o, {[e.getSheetName()]: e}), {});
// 3. Check whether the sheet names from the column "B" are existing.
// 4. Create the object for putting to each sheet using Sheets API.
var data = rangeValues.reduce((o, e) => {
if (sheets[e[1]]) {
if (o[e[1]]) {
o[e[1]].values.push(e);
} else {
o[e[1]] = {range: `'${e[1]}'!A${sheets[e[1]].getLastRow() + 1}`, values: [e]};
}
}
return o;
}, {});
// 5. Request the method of spreadsheets.values.batchUpdate of Sheets API using the created object.
Sheets.Spreadsheets.Values.batchUpdate({data: Object.values(data), valueInputOption: "USER_ENTERED"}, ss.getId());
}