相当于 Google Apps 脚本中的“ScreenUpdating”(相当于 VBA-GAS)

Posted

技术标签:

【中文标题】相当于 Google Apps 脚本中的“ScreenUpdating”(相当于 VBA-GAS)【英文标题】:Equivalent of “ScreenUpdating” in Google Apps Script (equivalent VBA-GAS ) 【发布时间】:2013-07-18 23:05:40 【问题描述】:

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

Application.ScreenUpdating = False

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

【问题讨论】:

【参考方案1】:

虽然我了解以下内容不一定会加快宏的速度,但它会带来更好的用户体验,并且需要注意。 对于许多函数调用和更新,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();

【讨论】:

【参考方案2】:

我解决这个问题的方法是绕过“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】:

我最终创建了第二张名为“开始”的工作表,其中只有 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();

【讨论】:

不幸的是,这种方法不会提高整体宏速度 =(【参考方案4】:

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

【讨论】:

你能解释一下吗?如果我正在读取和更新单个列,我应该将该列作为一个范围并读取更新范围吗?我使用 myrange.getRange(1, 2).setValue('Title');而不是 sheet.getRange(1, 2).setValue('Title');还是我很密集? 这是对谷歌部分恕我直言的疏忽。批量写入单元格适用于单个工作表,但不适用于在电子表格中添加、删除或重新排序工作表。由于动画试图跟上而产生的混乱并不漂亮。

以上是关于相当于 Google Apps 脚本中的“ScreenUpdating”(相当于 VBA-GAS)的主要内容,如果未能解决你的问题,请参考以下文章

Google Apps 脚本:奇怪的“缺少 ; before statement”。错误

使用Google Apps脚本删除Google表格中的行

Google Apps脚本中的Google Drive通知

使用 Apps 脚本对 Google 表格中的边框进行条件格式设置

如何从 Google 电子表格中的 Google Apps 脚本自动更新“站点地图”功能?

如何保护 Google 电子表格中的 Apps 脚本代码?