【问题标题】:Service Spreadsheet Time Out - Optimizing Macro script?服务电子表格超时 - 优化宏脚本?
【发布时间】:2022-11-09 06:31:00
【问题描述】:

语境

我有一个 g-sheet,它充当一种“主表”,其中所有内容都从一堆其他外部电子表格中涌入,这些电子表格全天都在实时更新。

我连接的每个外部电子表格都通过 importrange 函数路由到我们的主电子表格中自己的选项卡

所有这些选项卡然后使用行 ID # 路由到一个主选项卡 - 以便每个人都可以从该选项卡工作。

问题

在这个所有内容所在的主选项卡中,我有一个宏对行进行排序,以将最近的行置于顶部,除其他外,以保持数据清洁。随着时间的推移,随着我连接更多工作表,我添加到宏中的数字以容纳新行。

几天前宏开始抛出“服务电子表格在访问带有 id 的文档时超时......”然后 id 是主选项卡本身的 id #。

知道在不使用大带宽宏的情况下可能有更流畅的方法来完成这项工作,但是优化脚本以最适合用例远远超出了我的经验水平。我的宏如下:

function MasterSormat2() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('D1').activate();
  var criteria = SpreadsheetApp.newFilterCriteria()
  .setHiddenValues([''])
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(4, criteria);
  criteria = SpreadsheetApp.newFilterCriteria()
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(4, criteria);
  criteria = SpreadsheetApp.newFilterCriteria()
  .setHiddenValues([''])
  .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(4, criteria);
  spreadsheet.getRange('A1:AP11001').activate();
  spreadsheet.getActiveRange().offset(1, 0, spreadsheet.getActiveRange().getNumRows() - 1).sort({column: 4, ascending: false});
  spreadsheet.getRange('A:AM').activate();
  spreadsheet.getActiveRangeList().setFontFamily('Calibri')
  .setHorizontalAlignment('left');
  spreadsheet.getRange('P:S').activate();
  spreadsheet.getActiveRangeList().setHorizontalAlignment('right');
  spreadsheet.getRange('U:U').activate();
  spreadsheet.getActiveRangeList().setHorizontalAlignment('right');
  spreadsheet.getRange('AA:AG').activate();
  spreadsheet.getActiveRangeList().setHorizontalAlignment('right');
  spreadsheet.getRange('AL:AL').activate();
  spreadsheet.getActiveRangeList().setHorizontalAlignment('right')
  .setNumberFormat('"$"#,##0.00');
  spreadsheet.getRange('D4').activate();
};

在改进这一点时,谁能指出我正确的方向?

感谢您在这里提供的任何帮助,我期待进一步学习

【问题讨论】:

  • 请学习如何在不过度使用 activate() 的情况下编写宏;

标签: javascript google-apps-script google-sheets optimization macro-recorder


【解决方案1】:

我建议您花一些时间学习 JavaScript 基础知识,以便能够理解录制的宏并使其适应您的需求。

假设你了解了原语,对象, 属性, 类,方法, 文字和变量并了解方法的基础知识链接因为宏记录器经常使用它。

您可能会发现有助于优化录制的宏的一件事是将对象分配给变量。 IE。将对应于活动工作表的 Class Sheet 对象分配给名为 sheet 的变量:

var sheet = spreadsheet.getActiveSheet();

然后将所有spreadsheet.getActiveSheet() 替换为sheet

为了提高录制宏的性能,您还应该更换

spreadsheet.getRange(something).activate();

经过

var rangeSomething =  spreadsheet.getRange(something);  

然后将以下spreadsheet.getRange(something).activate();之前的spreadsheet.getRange(something).chain1替换为rangeSomething.chain1

如果您发现多个喜欢

spreadsheet.getRange('P:S').activate();
spreadsheet.getActiveRangeList().setHorizontalAlignment('right');

用这样的东西替换这些行:

var rangeList = spreadsheet.getRangeList(['P:S','U:U','AA:AG','AL:AL']);
rangeList.setHorizontalAlignment('right');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2018-01-28
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    相关资源
    最近更新 更多