相当于 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”。错误
使用 Apps 脚本对 Google 表格中的边框进行条件格式设置