Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/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
Performance Google sheets脚本超出了最大执行时间_Performance_Google Apps Script_Time_Limit_Stock - Fatal编程技术网

Performance Google sheets脚本超出了最大执行时间

Performance Google sheets脚本超出了最大执行时间,performance,google-apps-script,time,limit,stock,Performance,Google Apps Script,Time,Limit,Stock,我编写了一个脚本,将股票数据从存储在Google Drive中的csv文件导入到现有的Google工作表中 在一个函数中,我对多个csv文件执行此操作。不幸的是,我有时会“超过最大执行时间”,但并非总是这样 您知道我如何提高这方面的性能吗: //++++++++++++++ SPY +++++++++++++++++++ var file = DriveApp.getFilesByName("SPY.csv").next(); var csvData = Utilit

我编写了一个脚本,将股票数据从存储在Google Drive中的csv文件导入到现有的Google工作表中

在一个函数中,我对多个csv文件执行此操作。不幸的是,我有时会“超过最大执行时间”,但并非总是这样

您知道我如何提高这方面的性能吗:

   //++++++++++++++ SPY +++++++++++++++++++

var file = DriveApp.getFilesByName("SPY.csv").next();
var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());


//Create new temporary sheet
var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var yourNewSheet = activeSpreadsheet.getSheetByName("SPY-Import");

if (yourNewSheet != null) {
    activeSpreadsheet.deleteSheet(yourNewSheet);
}

yourNewSheet = activeSpreadsheet.insertSheet();
yourNewSheet.setName("SPY-Import");

//Import
var sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);

//Copy from temporary sheet to destination
var spreadsheet = SpreadsheetApp.getActive();
spreadsheet.getRange('A:B').activate();
spreadsheet.setActiveSheet(spreadsheet.getSheetByName('SPY'), true);
spreadsheet.getRange('A2').activate();
spreadsheet.getRange('\'SPY-Import\'!A:B').copyTo(spreadsheet.getActiveRange(), 
SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);


//Delete temporary sheet

// Get Spreadsheet Object
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// Get target sheet object
var sheet = spreadsheet.getSheetByName("SPY-Import");
// Delete
 spreadsheet.deleteSheet(sheet);

提前谢谢

我相信你的情况和目标如下

  • 您有几个CSV文件,如
    SPY.CSV
  • 您的电子表格具有与每个CSV文件对应的多张表格,如
    SPY
  • 您希望将CSV数据中的值放入电子表格。
    • 您希望将CSV数据的列“A”和“B”的值放入
  • 在当前情况下,您多次复制问题中的脚本,并通过更改csv文件名和工作表名称来运行它们
  • 您希望降低脚本的处理成本。我这样理解你的目标
修改点:
  • SpreadsheetApp.getActiveSpreadsheet()
    被多次使用。并且,
    activate()
    被多次使用。
    • 我认为在您的情况下,
      SpreadsheetApp.getActiveSpreadsheet()
      可以声明一次,并且不需要使用
      activate()
  • 为了将CSV数据复制到电子表格,CSV数据被放入临时工作表中,所需的值被复制到目标工作表中。
    • 在这种情况下,我认为CSV数据通过在阵列上处理直接放入目标工作表
我认为以上几点可以降低工艺成本。当上述各点反映到脚本中时,它将变成如下所示

修改脚本: 请复制并粘贴以下脚本,并准备
obj
的变量。运行脚本时,将检索和处理CSV数据,然后将值放入电子表格

function myFunction() {
  var obj = [
    {filename: "SPY.csv", sheetname: "SPY"},
    {filename: "###.csv", sheetname: "###"},
    ,
    ,
    ,
  ];
  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  obj.forEach(({filename, sheetname}) => {
    var file = DriveApp.getFilesByName(filename);
    if (file.hasNext()) {
      var sheet = ss.getSheetByName(sheetname);
      if (sheet) {
//        sheet.clearContents(); // Is this requierd in your situation?
        var csv = DriveApp.getFileById(file.next().getId()).getBlob().getDataAsString();
        var values = Utilities.parseCsv(csv).map(([a, b]) => [a, b]);
        sheet.getRange(2, 1, values.length, 2).setValues(values);
      }
    }
  });
}
注:
  • 请在启用V8时使用此脚本
  • 我不确定你的CSV数据。因此,当无法使用
    Utilities.parseCsv(csv)
    时,请使用分隔符
  • 在此修改中,使用了电子表格服务。如果上述修改后的脚本出现相同的错误,
    超过了最长执行时间
    ,请告诉我。当时,我想提出使用Sheets API的示例脚本
参考资料:

我可以问一下您问题中的脚本与一个函数中的
之间的关系吗?我正在为多个csv文件执行此操作。
?你问题中的脚本是在循环中运行的?我不是在循环中运行它,只是因为缺少编程技巧。因此,在这个功能中,贴出的剪贴会被复制多次。谢谢回复。在您的情况下,问题中的脚本将被复制,并在一次执行中运行多个脚本。如果我的理解是正确的,您在一次执行中使用脚本的次数是多少?另外,我可以问一下您在使用复制的脚本时的更改部分吗?在您的例子中,这是
DriveApp.getFilesByName(“SPY.csv”)
SPY.csv
activeSpreadsheet.getSheetByName(“SPY导入”)
SPY
(spreadsheet.getSheetByName(“SPY”)的
?感谢您的回复。为了说明这一点:To posted snipped是针对不同的股票报价在一个函数中复制的。我刚刚发布了这一部分,因为它的长度。它大约运行4-5分钟,然后我得到了“超出时间限制”错误。嗨,塔奈克,非常感谢你的解决方案和出色的解释!!它工作得非常好,对我来说完全有意义!clearContents()在我的例子中不是nessecary,但是谢谢你把它放在那里。你的信息:我构建了一个Python脚本来从Yahoo Finance下载csv数据。在下一步中,我将尝试从google sheets中运行该脚本,以便在每天的基础上使用时间触发器完全自动化is。