5

我正在寻找等效的 VBA-GAS:

Application.ScreenUpdating = False

我在我的一个 Google 电子表格中运行了一个很长的宏,每次完成它至少需要 30 秒。如果宏在每一行代码后都没有刷新屏幕,那将会很有帮助。

4

4 回答 4

4

没有。但是,您应该将所有 setValues 批量写入范围写入(理想情况下是单个范围写入),这将对此有所帮助。
仅在最后调用 SpreadsheetApp.flush()。

于 2013-07-19T17:58:18.647 回答
1

我最终创建了第二张名为“开始”的工作表,其中只有 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();
于 2015-11-09T20:53:21.907 回答
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);

并且可以从文档上的任何工作表运行,而无需更改选定的工作表或单元格。

谷歌自动添加这种冗余可能是有原因的,但这似乎在我使用它的每种情况下都有效。

于 2020-05-03T04:27:46.160 回答
0

虽然我知道以下内容不一定会加速宏,但它可以提供更好的用户体验,并且需要注意。对于许多函数调用和更新,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();
于 2020-05-13T15:30:23.243 回答