Javascript Google应用程序脚本超出了执行时间限制

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]。下面是电子表格的代码和屏幕截图 这样合适吗?请帮助我更快地运行脚本

我有一个几乎160个子表谷歌表。所有问题都在“全部”表中,B列是实际的电子表格名称,它们应该在哪里。下面的代码从“所有”电子表格中读取数据,并将它们完美地发送到所需电子表格的最后一行,但这需要很长时间!可能是因为它有很多子表,并且一次又一次地使用getSheetByName。现在,我已将所有子图纸的名称和ID同时存储在“图纸”和“图纸ID”数组中。我正在考虑比较
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());
    }