我撰寫了一些腳本來幫助我清理/重置我們每周重復使用的作業表。我們的想法是我們有大約 50 人使用它,由于惡意和無知的結合,他們經常找到繞過我們權限的方法,并編輯我們不希望他們做的事情。最近,這個作業表變得如此之大,以至于我寫得不好的腳本會在到達結尾之前超時。(我們目前有大約 250 張紙。)我已經能夠重寫其中的大部分內容并顯著降低了運行時間。不過,有一個步驟繼續讓我慢下來:在每一頁上洗掉并重新應用條帶到特定范圍 (A5:H27)。
有什么方法可以使此代碼更高效,并將此步驟的運行時間從大約 12 分鐘減少到 12 分鐘?
function fixBanding(){
var spreadsheet = SpreadsheetApp.getActive();
var allSheets = spreadsheet.getSheets();
allSheets.forEach(function(sheet){
if(sheet.getSheetName() !== "HelperSheet"){
sheet.getRange('A5:H27').activate();
sheet.getRange("A5:H27").getBandings().forEach(banding => banding.remove());
sheet.getRange("A5:H27").applyRowBanding()
.setHeaderRowColor('white')
.setFirstRowColor('#cbcbcb') //med grey
.setSecondRowColor('white');
}
})
}
uj5u.com熱心網友回復:
我相信你的目標如下。
- 你的腳本作業正常。而且,您希望降低腳本的流程成本。
在這種情況下,如何使用 Sheets API?使用 Sheets API 時,可以稍微降低處理成本。當您的腳本中使用 Sheets API 時,它變成如下。
修改后的腳本:
在您使用此腳本之前,請在 Advanced Google servives 啟用 Sheets API。
function myFunction() {
// Retrieve sheet IDs and andedRange IDs.
const ss = SpreadsheetApp.getActive();
const spreadsheetId = ss.getId();
const { sheetIds, bandedRangeIds } = Sheets.Spreadsheets.get(spreadsheetId, { fields: "sheets(properties(sheetId,title),bandedRanges(bandedRangeId))" }).sheets.reduce((o, { properties: { sheetId, title }, bandedRanges }) => {
if (title != "HelperSheet") {
o.sheetIds.push(sheetId);
o.bandedRangeIds = [...o.bandedRangeIds, ...bandedRanges.map(({ bandedRangeId }) => bandedRangeId)];
}
return o;
}, { sheetIds: [], bandedRangeIds: [] });
// Create the request body for Sheets API.
const firstBandColor = { red: 0.79, green: 0.79, blue: 0.79 };
const secondBandColor = { red: 1, green: 1, blue: 1 };
const headerColor = { red: 1, green: 1, blue: 1 };
const requests = [...bandedRangeIds.map(id => ({ deleteBanding: { bandedRangeId: id } })), ...sheetIds.map(sheetId => ({ addBanding: { bandedRange: { rowProperties: { headerColor, firstBandColor, secondBandColor }, range: { sheetId, startRowIndex: 4, endRowIndex: 27, startColumnIndex: 0, endColumnIndex: 8 } } } }))
];
// Request to Sheets API using the created request body.
Sheets.Spreadsheets.batchUpdate({ requests }, spreadsheetId);
// If you want to activate 'A5:H27' in each sheet, please use the following script.
// SpreadsheetApp.flush();
// ss.getSheets().forEach(sheet => {
// if (sheet.getSheetName() !== "HelperSheet") sheet.getRange('A5:H27').activate();
// });
}
參考:
- 方法:電子表格.batchUpdate
- 洗掉系結請求
- 添加系結請求
uj5u.com熱心網友回復:
似乎您的代碼已經足夠優化,我認為您可以通過以下方式將運行拆分為多個運行:
1)在回圈開始時初始化一個日期變數以存盤當前時間
2)在回圈作業表時不斷檢查總時間從開始過去
3) 如果總時間大于總腳本可用執行時間 (6 分鐘) 的 80%,則在 20 秒后啟動新的觸發計劃可安裝觸發器
4) 并存盤作業表編號或名稱您已經在新的 excel 作業表(比如配置)中完成了處理
5)當觸發器啟動時,代碼應該從“配置”作業表中獲取作業表名稱/編號,這是處理已經完成的作業表完成并在該作業表編號后開始處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/377820.html
上一篇:例外:引數(String,String,String,(class),(class))與GmailApp.sendEmail的方法簽名不匹配
