Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 谷歌应用程序脚本执行时间问题_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 谷歌应用程序脚本执行时间问题

Google apps script 谷歌应用程序脚本执行时间问题,google-apps-script,google-sheets,Google Apps Script,Google Sheets,Im目前正在使用Google Apps脚本实现供应链数据库的查看器。 为了使查看器与当前数据库(google电子表格)同步,我将值和所有格式导入到一个新的工作表中,这意味着查看器基本上是当前数据库的副本 但是,执行脚本总是需要大约1分钟的时间。我试图找到在代码中不同位置记录一些调试消息的问题。 起初,它似乎是带有Viewer.setFrozenRows(1)的行(这很奇怪,因为我实际上只冻结了第一行)是问题所在,但是在注释这一行时,后面的行(Viewer.setFrozenColumns(Dat

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

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

不幸的是,我无法与您共享数据库表,但也许有人已经可以从代码中发现问题

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

函数LoadViewer(视图){
Logger.log(“LoadViewer启动”);
如果(视图==null){
视图=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.getConditionalFormatures();
var headerRowHeight=Database.getRowHeight(1);
var dataRowHeight=Database.getRowHeight(2);
var Values=Database.getRange(1,1,numberOfRows,numberOfColms).getValues();
Logger.log(“声明完成”);
getRange(1,1,numberOfRows,numberOfColms).setValues(值);
如果(!Viewer.getRange(1,1,numberOfRows,numberOfColms).getFilter())
getRange(1,1,numberOfRows,numberOfColms).createFilter();
Viewer.setConditionalFormatures(规则);
getRange(1,1,1,numberOfColms).setFontWeight('bold');
Viewer.autoResizeColumns(1,numberOfColms);
查看器。设置行高(1,头视);
Logger.log(“上半部分功能完成”);
Viewer.setRowHeights(2,numberOfRows-1,dataRowHeights);
Logger.log(“冻结行”);
//查看器.setFrozenRows(1);
Logger.log(“冻结列”);
setFrozenColumns(Database.getFrozenColumns());
Logger.log(“循环启动”);

对于(var i=1;i我可以看到代码的两个优化点:

  • 对任何外部服务(包括电子表格应用程序)的请求都会使您的代码变慢-请参阅

    因此,在
    for
    循环中调用SpreadsheetApp方法会降低代码速度

    通过将循环中的多个
    setColumnWidth()
    请求替换为一次避免迭代,您将能够加快代码的速度

  • 记录工作表中的列数和行数

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

    如果是这种情况,请手动删除备用行和列,或使用而不是
    getLastRow()
    getLastColumn()


  • 对于您的代码,我可以看到两个优化点:

  • 对任何外部服务(包括电子表格应用程序)的请求都会使您的代码变慢-请参阅

    因此,在
    for
    循环中调用SpreadsheetApp方法会降低代码速度

    通过将循环中的多个
    setColumnWidth()
    请求替换为一次避免迭代,您将能够加快代码的速度

  • 记录工作表中的列数和行数

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

    如果是这种情况,请手动删除备用行和列,或使用而不是
    getLastRow()
    getLastColumn()

  • 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");
    }