【问题标题】:Google Apps Script execution time issueGoogle Apps 脚本执行时间问题
【发布时间】:2020-09-08 21:08:23
【问题描述】:

我目前正在使用 Google Apps 脚本来实现供应链数据库的查看器。 为了将查看器与当前数据库(谷歌电子表格)同步,我将值和所有格式导入到新工作表中,这意味着查看器基本上是当前数据库的副本。

但是执行脚本总是需要大约 1 分钟的时间。我试图通过在代码的不同位置记录一些调试消息来找到问题。 起初,Viewer.setFrozenRows(1); 的行似乎是问题所在(这很奇怪,因为我实际上只冻结了第一行),但是当注释掉这一行时,之后的行(Viewer.setFrozenColumns(Database.getFrozenColumns());)似乎是问题所在。

很遗憾,我无法与您共享数据库表,但也许有人已经从代码中发现了问题。

一些附加信息:数据库表有1300行100列,我在下面添加了当前代码的日志图片。

function LoadViewer(view) {
  Logger.log("LoadViewer Start");
   if (view == null) {
    view = 0;
  }
  var Database = SpreadsheetApp.openByUrl('[SHEET_URL].getSheetByName('Database');
  var Viewer = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
  var numberOfColms = Database.getLastColumn();
  var numberOfRows = Database.getLastRow();
  var rules = Database.getConditionalFormatRules();
  var headerRowHeight = Database.getRowHeight(1);
  var dataRowHeight = Database.getRowHeight(2);
  var Values = Database.getRange(1, 1, numberOfRows, numberOfColms).getValues();

  Logger.log("Declarations Finished");

  Viewer.getRange(1, 1,numberOfRows,numberOfColms).setValues(Values);
  if(!Viewer.getRange(1, 1,numberOfRows,numberOfColms).getFilter()) 
    Viewer.getRange(1, 1,numberOfRows,numberOfColms).createFilter(); 
  Viewer.setConditionalFormatRules(rules);
  Viewer.getRange(1, 1, 1, numberOfColms).setFontWeight('bold');
  Viewer.autoResizeColumns(1, numberOfColms);
  Viewer.setRowHeight(1, headerRowHeight);

  Logger.log("1st Half of functions finished");

  Viewer.setRowHeights(2, numberOfRows-1, dataRowHeight);

  Logger.log("Freeze Rows");

  //Viewer.setFrozenRows(1);

  Logger.log("Freeze Columns");

  Viewer.setFrozenColumns(Database.getFrozenColumns());

  Logger.log("Loop Start");
  for(var i = 1; i<=numberOfColms; i++){
    Viewer.setColumnWidth(i, Database.getColumnWidth(i));
  }
  Logger.log("Loop End");

  Viewer.getRange(1, 1,1,numberOfColms).setVerticalAlignment('middle').setWrap(true);
  Logger.log("Load Viewer End");
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我可以为您的代码看到两个优化点:

    1. 对包括 SpreadsheetApp 在内的任何外部服务的请求会使您的代码变慢 - 请参阅 Best Practices

      因此,在 for 循环中调用 SpreadsheetApp 方法会减慢您的代码速度。

      您将能够通过将循环中的多个 setColumnWidth() 请求替换为单个 setColumnWidths(startColumn, numColumns, width) 来加速您的代码 - 避免迭代。

    2. 记录工作表中的列数和行数。

      一个常见问题是工作表包含大量空行和空列,这会增加检测到的数据范围,从而将后续调用应用于比必要更大的范围。

      如果您遇到这种情况 - 要么手动删除多余的行和列,要么使用 getNextDataCell() 而不是 getLastRow()getLastColumn()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多