【问题标题】:Google App Script Exceeded Maximum Execution LimitGoogle App 脚本超出最大执行限制
【发布时间】:2021-10-27 01:14:04
【问题描述】:

我一直在尝试导出我的spreadsheet 的全部内容。该代码运行良好,但显示一条错误消息,指出超出了最大执行限制。根据我的研究,最长执行时间仅为 6 分钟。我对此很陌生,但仍在尝试弄清楚。您能帮我确定一个可能的解决方案吗?

这是我目前正在使用的code...

function PrintMultiple() {

  const srcSs = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = srcSs.getSheetByName("TEMPLATE");
  const values = sheet.getRange("C2").getDataValidation().getCriteriaValues()[0].getValues().flat().filter(String);
  const dstSs = SpreadsheetApp.create("tempSpreadsheet");

  SpreadsheetApp.getActive().toast("About to take some action... Please wait...");

  values.forEach(v => {
    sheet.getRange("C2").setValue(v);
    SpreadsheetApp.flush();
    const tempSheet = sheet.copyTo(srcSs);
    const range = tempSheet.getDataRange();
    range.copyTo(range, {contentsOnly: true});
    tempSheet.getRange("B2:2").clear().clearDataValidations();
    tempSheet.getDrawings().forEach(e => e.remove());
    tempSheet.deleteColumn(1);
    tempSheet.deleteRow(1);
    tempSheet.deleteRow(2);
    tempSheet.deleteRow(3);
    tempSheet.copyTo(dstSs);
    srcSs.deleteSheet(tempSheet);
  });
  dstSs.deleteSheet(dstSs.getSheets()[0]);
}

【问题讨论】:

  • 虽然我不确定您的实际电子表格,但我提出了修改后的脚本以降低流程成本作为答案。你能确认一下吗?如果这不是您问题的直接解决方案,我深表歉意。

标签: google-apps-script google-sheets google-sheets-api


【解决方案1】:

我相信你的目标如下。

  • 您希望降低脚本的处理成本。

从你的脚本来看,当values的长度很大时,我认为复制的过程可能是高成本。那么,在这种情况下,使用 Sheets API 怎么样?我认为当使用 Sheets API 时,您的脚本的处理成本可能会降低。当您的脚本使用 Sheets API 时,它变为如下。

修改脚本:

在使用此脚本之前,please enable Sheets API at Advanced Google services。

function PrintMultiple() {
  const ss = SpreadsheetApp.getActiveSpreadsheet().copy("tempSpreadsheet");
  const sheet = ss.getSheetByName("TEMPLATE");
  const sourceSheetId = sheet.getSheetId();
  sheet.getDrawings().forEach(e => e.remove());
  const values = sheet.getRange("C2").getDataValidation().getCriteriaValues()[0].getValues().flat().filter(String);
  const requests1 = values.flatMap((v, i) => {
    const sheetId = 123456 + i;
    return [
      { duplicateSheet: { newSheetName: `page${i + 1}`, sourceSheetId, newSheetId: sheetId, insertSheetIndex: i + 2 } },
      { updateCells: { range: { sheetId: sheetId, startRowIndex: 1, endRowIndex: 2, startColumnIndex: 2, endColumnIndex: 3 }, rows: [{ values: [{ userEnteredValue: { numberValue: v } }] }], fields: "userEnteredValue.numberValue" } },
    ];
  });
  Sheets.Spreadsheets.batchUpdate({ requests: requests1 }, ss.getId());
  const requests2 = values.flatMap((_, i) => {
    const sheetId = 123456 + i;
    return [
      { copyPaste: { source: { sheetId }, destination: { sheetId }, pasteType: "PASTE_VALUES" } },
      { deleteDimension: { range: { sheetId, startIndex: 0, endIndex: 3, dimension: "ROWS" } } },
      { deleteDimension: { range: { sheetId, startIndex: 0, endIndex: 1, dimension: "COLUMNS" } } },
    ];
  });
  Sheets.Spreadsheets.batchUpdate({ requests: requests2 }, ss.getId());
  ss.deleteSheet(sheet);
  ss.deleteSheet(ss.getSheets()[0]);
}
  • 在本次修改中,Sheets API的batchUpdate方法用于复制值和删除行和列。
  • 运行此脚本时,会在根文件夹中创建“tempSpreadsheet”电子表格。

参考:

【讨论】:

  • 成功了!谢谢你!
  • @cjwrk 感谢您的回复。很高兴您的问题得到解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多