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

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

Application.ScreenUpdating = False

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

【问题讨论】:

    标签: vba google-apps-script refresh spreadsheet updating


    【解决方案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');还是我很密集?
        • 这是对谷歌部分恕我直言的疏忽。批量写入单元格适用于单个工作表,但不适用于在电子表格中添加、删除或重新排序工作表。由于动画试图跟上而产生的混乱并不漂亮。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多