Performance Google sheets脚本超出了最大执行时间
我编写了一个脚本,将股票数据从存储在Google Drive中的csv文件导入到现有的Google工作表中 在一个函数中,我对多个csv文件执行此操作。不幸的是,我有时会“超过最大执行时间”,但并非总是这样 您知道我如何提高这方面的性能吗: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
//++++++++++++++ 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。