我一直在嘗試匯出我的電子表格的全部內容。該代碼作業正常,但它顯示一條錯誤訊息,指出Maximum execution limit exceeded。根據我的研究,最長執行時間僅為 6 分鐘。我是新手,我仍在努力弄清楚。你能幫我確定一個可能的解決方案嗎?
這是我目前正在使用的代碼...
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]);
}
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您希望降低腳本的流程成本。
從你的腳本來看,當長度values很大時,我認為復制的程序可能是高成本的。那么,在這種情況下,如何使用 Sheets API?我認為當使用 Sheets API 時,您的腳本的處理成本可能會降低。當 Sheets API 用于您的腳本時,它變成如下。
修改后的腳本:
在使用此腳本之前,請在高級 Google 服務中啟用 Sheets API。
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”電子表格。
參考:
- 方法:電子表格.batchUpdate
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/338166.html
標籤:谷歌应用程序脚本 谷歌表格 google-sheets-api
