我正在寻找等效的VBA-GAS:
Application.ScreenUpdating = False
我在我的某个Google Spreadsheets中运行了一个非常长的宏,每次完成它至少需要30秒。如果宏在每行代码之后都没有刷新屏幕会很有帮助。
答案 0 :(得分:3)
没有。但是,您应该将所有setValues批量写入范围写入(理想情况下是单个范围写入),这将有助于此。
仅在最后调用SpreadsheetApp.flush()。
答案 1 :(得分:1)
我最终创建了第二张名为' Start'只有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();
答案 2 :(得分:0)
我解决这个问题的方法是绕过“ 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);
,并且可以在不更改所选工作表或单元格的情况下从文档中的任何工作表运行。
Google可能有理由自动添加此冗余,但这在我使用过的每种情况下似乎都有效。
答案 3 :(得分:0)
虽然我了解以下内容不一定会加快宏的速度,但它可以带来更好的UX,并且需要注意。 对于许多函数调用和更新,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();