我在使用應用程式腳本自動化檔案方面很新。我有一個動態電子表格(4000 多行),每天早上更新,之后必須使用特殊條件重新分組資料。所以我有一個腳本和設定時間觸發器。但是運行這個腳本需要很多時間(~30 分鐘),而且我擔心如果資料量會增長 - 將會有很多失敗(因為超時)。我在下面留下我的腳本。你能給我一些建議,我如何優化這個腳本,讓它運行得更快?先感謝您!
function removeAllGroups() {
let sheet = SpreadsheetApp.getActive().getSheetByName("sheet1");
let lastRow = sheet.getDataRange().getLastRow();
for (let row = 1; row < lastRow; row ) {
let depth = sheet.getRowGroupDepth(row);
if (depth < 1) continue;
sheet.getRowGroup(row, depth).remove();
}
}
function groupRows() {
const sheetName = "sheet1";
const rootSheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
const levels = rootSheet.getRange("A2:A" rootSheet.getLastRow()).getValues();
levels.forEach(([a], i) => rootSheet.getRange(i 2, 1).shiftRowGroupDepth(a));
}
uj5u.com熱心網友回復:
嘗試這個:
function removeAllGroups() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("sheet1");
const rg = sh.getDataRange();
const vs = rg.getValues();
vs.forEach((r, i) => {
let d = sh.getRowGroupDepth(i 1);
if (d >= 1) {
sh.getRowGroup(i 1, d).remove()
}
});
}
function groupRows() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1');
const levels = sh.getRange(2, 1, sh.getLastRow() - 1).getValues().flat();
levels.forEach((e, i) => sh.getRange(i 2, 1).shiftRowGroupDepth(e));
}
uj5u.com熱心網友回復:
我相信你的目標如下。
- 您想降低
removeAllGroups和函式的程序成本groupRows。
我認為在你的腳本時,我看到你的腳本,程序成本sheet.getRowGroup(row, depth).remove(),并rootSheet.getRange(i 2, 1).shiftRowGroupDepth(a)可能會高。在這種情況下,我想建議使用 Sheets API。我認為當使用 Sheets API 時,流程成本可能會降低一些。當 Sheets API 反映在你的腳本中時,它變成如下。
示例腳本:
在運行此腳本之前,請在 Advanced Google services 中啟用 Sheets API。
function removeAllGroups() {
const sheetName = "sheet1";
const ss = SpreadsheetApp.getActive();
const ssId = ss.getId();
const sheetId = ss.getSheetByName(sheetName).getSheetId();
const n = Sheets.Spreadsheets.get(ssId, { ranges: [sheetName] }).sheets[0].rowGroups.reduce((n, { depth }) => n < depth ? depth : n, 0);
const requests = Array(n).fill("").map(_ => ({ deleteDimensionGroup: { range: { sheetId, dimension: "ROWS" } } }));
Sheets.Spreadsheets.batchUpdate({ requests }, ssId);
}
function groupRows() {
const sheetName = "sheet1";
const ss = SpreadsheetApp.getActive();
const rootSheet = ss.getSheetByName(sheetName);
const levels = rootSheet.getRange("A2:A" rootSheet.getLastRow()).getValues();
const sheetId = rootSheet.getSheetId();
const requests = levels.flatMap(([a], i) => Array(a).fill("").map(_ => ({ addDimensionGroup: { range: { sheetId, startIndex: i 1, endIndex: i 2, dimension: "ROWS" } } })));
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}
筆記:
- 當上面修改的腳本沒有用時,您能否提供示例電子表格?通過這個,我想修改腳本。
參考:
- 方法:電子表格.get
- 方法:電子表格.batchUpdate
- 洗掉維度組請求
- 添加維度組請求
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/343991.html
