我正在寻找等效的 VBA-GAS:
Application.ScreenUpdating = False
我在我的一个 Google 电子表格中运行了一个很长的宏,每次完成它至少需要 30 秒。如果宏在每一行代码后都没有刷新屏幕,那将会很有帮助。
我正在寻找等效的 VBA-GAS:
Application.ScreenUpdating = False
我在我的一个 Google 电子表格中运行了一个很长的宏,每次完成它至少需要 30 秒。如果宏在每一行代码后都没有刷新屏幕,那将会很有帮助。
没有。但是,您应该将所有 setValues 批量写入范围写入(理想情况下是单个范围写入),这将对此有所帮助。
仅在最后调用 SpreadsheetApp.flush()。
我最终创建了第二张名为“开始”的工作表,其中只有 A1=“请稍候......”。我显示所有数据的工作表称为“报告”
然后使用:
//Hide Report sheet
SpreadsheetApp.getActive().getSheetByName("Start").showSheet();
var sheet = SpreadsheetApp.getActive().getSheetByName("Report");
sheet.hideSheet();
//Code to update sheet here
sheet.appendRow('Blah','Blah','Blah');
//Show Report sheet
sheet.showSheet();
SpreadsheetApp.getActive().setActiveSheet(sheet);
SpreadsheetApp.getActive().getSheetByName("Start").hideSheet();
我解决这个问题的方法是绕过“setActiveSheet”或“activate”的每个实例。
例如:
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A2').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Sheet2'), true);
spreadsheet.getRange('B4').activate();
spreadsheet.getRange('Sheet1!A2').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
可以缩短为:
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('Sheet1!A2').copyTo(spreadsheet.getRange('Sheet2!B4'), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
并且可以从文档上的任何工作表运行,而无需更改选定的工作表或单元格。
谷歌自动添加这种冗余可能是有原因的,但这似乎在我使用它的每种情况下都有效。
虽然我知道以下内容不一定会加速宏,但它可以提供更好的用户体验,并且需要注意。对于许多函数调用和更新,VBA 首先要求我们“取消隐藏”相应的工作表:
' Unhide the sheet, write to it, hide it '
Dim lastrow As Long
Sheets("Report").Visible = True
Sheets("Report").Select
' Append a Row '
lastrow = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row + 1
ActiveSheet.Cells(lastrow, "A").Value = "Blah"
Sheets("Report").Select
ActiveWindow.SelectedSheets.Visible = False
许多 Google Apps 脚本类不需要相同:
// Hide the sheet, write to it, show it
var sheet = SpreadsheetApp.getActive().getSheetByName('Report').hideSheet();
sheet.appendRow(['Blah']);
sheet.showSheet();