Google sheet 的脚本时间限制
Script time limit for Google sheet
我需要在特定 sheet (LISTAFINAL) 的相同单元格中更改一些公式,这些单元格存在于大量传播 sheet 中,这些传播位于同一文件夹中。但它在 Google 6 分钟的脚本时间限制处停止,仅在 9 个传播sheet 秒内进行更改,并出现消息:Erro - Exceeded maximum execution time
.
- 我的目标:
我想知道是否有任何方法或加快此过程或更改更多的点差sheets 或两者兼而有之。这是代码:
function validacao(){
var folder = DriveApp.getFolderById("FOLDER ID");
var x = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
while (x.hasNext()) {
SpreadsheetApp.open(x.next()).getSheets().forEach(sheet => {
sheet.getRange('LISTAFINAL!F5:F15').activate();
sheet.getRange('LISTAFINAL!F5').setValue('=ALUNO1!$F7');
sheet.getRange('LISTAFINAL!F6').setValue('=ALUNO2!$F7');
sheet.getRange('LISTAFINAL!F7').setValue('=ALUNO3!$F7');
sheet.getRange('LISTAFINAL!F8').setValue('=ALUNO4!$F7');
sheet.getRange('LISTAFINAL!F9').setValue('=ALUNO5!$F7');
sheet.getRange('LISTAFINAL!F10').setValue('=ALUNO6!$F7');
sheet.getRange('LISTAFINAL!F11').setValue('=ALUNO7!$F7');
sheet.getRange('LISTAFINAL!F12').setValue('=ALUNO8!$F7');
sheet.getRange('LISTAFINAL!F13').setValue('=ALUNO9!$F7');
sheet.getRange('LISTAFINAL!F14').setValue('=ALUNO10!$F7');
sheet.getRange('LISTAFINAL!F15').setValue('=ALUNO11!$F7');
});
}
}
解释:
你为每个 spreadsheet 文件遍历所有 sheets。您的目标是只得到一个 sheet 并将公式放在特定的单元格中。因此,您可以摆脱 forEach
循环。
best practice 使用数组而不是迭代使用多个 google 应用程序脚本函数。
例如,在您的代码中,您使用了 getRange
和 setValue
11 次。如果将公式值存储在数组中,您将能够仅使用单个 getRange
和 setValues
.
来存储它们
解决方案:
function validacao(){
const folder = DriveApp.getFolderById("FOLDER ID");
const x = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
const formulas = Array(11).fill().map((_, i) => [`=ALUNO${i+1}!$F7`]);
while (x.hasNext()) {
let ss_target = SpreadsheetApp.open(x.next());
let sh = ss_target.getSheetByName("LISTAFINAL");
sh.getRange('F5:F15').setValues(formulas);
}
}
我需要在特定 sheet (LISTAFINAL) 的相同单元格中更改一些公式,这些单元格存在于大量传播 sheet 中,这些传播位于同一文件夹中。但它在 Google 6 分钟的脚本时间限制处停止,仅在 9 个传播sheet 秒内进行更改,并出现消息:Erro - Exceeded maximum execution time
.
- 我的目标:
我想知道是否有任何方法或加快此过程或更改更多的点差sheets 或两者兼而有之。这是代码:
function validacao(){
var folder = DriveApp.getFolderById("FOLDER ID");
var x = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
while (x.hasNext()) {
SpreadsheetApp.open(x.next()).getSheets().forEach(sheet => {
sheet.getRange('LISTAFINAL!F5:F15').activate();
sheet.getRange('LISTAFINAL!F5').setValue('=ALUNO1!$F7');
sheet.getRange('LISTAFINAL!F6').setValue('=ALUNO2!$F7');
sheet.getRange('LISTAFINAL!F7').setValue('=ALUNO3!$F7');
sheet.getRange('LISTAFINAL!F8').setValue('=ALUNO4!$F7');
sheet.getRange('LISTAFINAL!F9').setValue('=ALUNO5!$F7');
sheet.getRange('LISTAFINAL!F10').setValue('=ALUNO6!$F7');
sheet.getRange('LISTAFINAL!F11').setValue('=ALUNO7!$F7');
sheet.getRange('LISTAFINAL!F12').setValue('=ALUNO8!$F7');
sheet.getRange('LISTAFINAL!F13').setValue('=ALUNO9!$F7');
sheet.getRange('LISTAFINAL!F14').setValue('=ALUNO10!$F7');
sheet.getRange('LISTAFINAL!F15').setValue('=ALUNO11!$F7');
});
}
}
解释:
你为每个 spreadsheet 文件遍历所有 sheets。您的目标是只得到一个 sheet 并将公式放在特定的单元格中。因此,您可以摆脱
forEach
循环。best practice 使用数组而不是迭代使用多个 google 应用程序脚本函数。
例如,在您的代码中,您使用了
来存储它们getRange
和setValue
11 次。如果将公式值存储在数组中,您将能够仅使用单个getRange
和setValues
.
解决方案:
function validacao(){
const folder = DriveApp.getFolderById("FOLDER ID");
const x = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
const formulas = Array(11).fill().map((_, i) => [`=ALUNO${i+1}!$F7`]);
while (x.hasNext()) {
let ss_target = SpreadsheetApp.open(x.next());
let sh = ss_target.getSheetByName("LISTAFINAL");
sh.getRange('F5:F15').setValues(formulas);
}
}