第一次发帖,长时间阅读:)
我刚刚编写了我的第一个谷歌应用程序脚本来整理来自14个电子表格的信息,每张表格包含2-30个工作表到一个报告电子表格中.
该脚本运行得很漂亮,它检查单个列的数据,如果找到,则抓取电子表格名称,工作表名称,行的第一列数据和检查列中的数据,并将其作为数据子数组添加到数组中.
然后,它计算子数组数组的区域,并将数据写入报告文件(运行脚本的位置).
我唯一的问题是它需要大约2分钟的脚本才能运行.
我想知道我的方法是否效率低下,并希望有人可以查看脚本并告诉我是否犯了一些错误?
开始:
/** * Retrieves all the rows in the active spreadsheet that contain data and logs the * values for each row. * For more information on using the Spreadsheet API, see * https://developers.google.com/apps-script/service_spreadsheet */ function getFaults() { /** opens each spreadsheet for Liddon and examines the "Report/Replace" column "F" if there is data there then get the [Sheetname], [fault area (column "A" row relative to the "F" field found)] and the ["F" field data] **/ var reportsheet = SpreadsheetApp.getActiveSheet(); var reportdata = [] var reportrow = 0 var liddonblocks = [ "1APshQevK7iZxhP7--zmtuM3K6dPTgTZjmNarQ6CEsV4", "1riCQMOa38jo4nCD4qjW1BFZKk5xpXFZiCXHzXpiYKIU", "1NTKXmted1-U12MiqvCGRuYBdhPy1_eLiPn7v8_oVKFE", "1RKOJUNNi5TAg5dETZDtLjZOkUSheuguzmtdPelMclMI", "1b5-fzCp0wzW8llpUc_6xi1iTFzsapZh9ASSFgDYt4WU", "1qJtY37K0zwoJcz7LdyHhWgkypRMP9LabBchNLM4Fgow", "1yvf4W8-SkfTH-n-PdDNQeyEDEz-shzTe-Id57S_YB2M", "1ETZc1xeNGXU6ipb1XQiD8SiIyRXzZtiJfS4AClKroJk", "1tJ5u3Hv0uz-n2cdw-QYixKnuMG9skvrUbz1UROhIm34", "1DjhmIdD0GrPxR-fv7pCPkIwIyfai5BHsK9GhT-Hcs3k", "15w39NZZIacD1OfiTWG1E3HmOhV0B_e2Jsuan_ySwf2Q" , "1cK2HBLEftYOZEkCcxs1TX1PxcJRiKTZpQrcsOfE4B1s", "16W_bfMKk98wkLpEmm2Q68Ta_SrCA8EBarQyGF2yfm18","1_Z_tgF5UAfq3fxPsDEe40z2GZSehhL-u4hEuVszrbn8" ] // loop through the spreadsheets for (block = 0; block < liddonblocks.length; block++) { //open the spreadsheet using the index from the liddonblocks list var ss = SpreadsheetApp.openById(liddonblocks[block]); //get all of the sheets within the spreadsheet var sheets = ss.getSheets(); //loop through each sheet in each spreadsheet using the length of the number of sheets in the spreadsheet as the index for (var sheetnum = 0; sheetnum < sheets.length; sheetnum++) { //get an array of all data in the sheet //assigns array in the form of: [[area, fault], [Bedroom, Broken Bed], [Bathroom, ]] //where each sub-array is a row of data starting at row 1 eg: [[row1-col1, row1-col2...],[row2-col1, row2-col2...]...] data = sheets[sheetnum].getDataRange().getValues(); //get the text name of the sheet name = sheets[sheetnum].getSheetName(); // iterate over the data set and look for values in the 5th column, starting at row 7 to exclude the headers. // this is the column named "Report / Replace " for (var count = 7; count < data.length; count++) { if (data[count][5] != "" && data[count][5] != 0) { //if there is data in the 5th column of the row then append the following data to the reportdata array and a sub-array // [ sheetname, columnA, columnF ] reportdata[reportrow] = [ ss.getName(), name, data[count][0], data[count][5]] //increment the reportcount variable so any further hits on data in column 5 are created as sequentail sub-arrays in the reportdata array. reportrow++ } } } } //write the contents of reportdata to the console var range = reportsheet.getRange(2,1,reportrow,reportdata[0].length); range.setValues(reportdata); } /** * Adds a custom menu to the active spreadsheet, containing a single menu item * for invoking the readRows() function specified above. * The onOpen() function, when defined, is automatically invoked whenever the * spreadsheet is opened. * For more information on using the Spreadsheet API, see * https://developers.google.com/apps-script/service_spreadsheet */ function onOpen() { var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var entries = [{ name : "Update Report", functionName : "getFaults" }]; spreadsheet.addMenu("Keble Scripts", entries); };
Muhammad Gel.. 9
首先,请查看此页面上的信息.
我经历过的三件事可以让你失望的是:
多次呼叫外部服务
在循环中调用SpreadsheetApp.flush()以强制更新工作表.
调用Range.getValue()很多.
对于第一部分,请尝试批量拨打电话.例如,如果您要求本地货币和外国货币的汇率,请尝试在一个请求中发送一堆查询.
对于第二部分,除非确实需要,否则不要调用此方法.
对于第三部分,尝试修改您的代码,以便您可以调用此方法一次并使用其结果移动而不是在多个方法中调用它以获得相同的结果.
提示:要避免修改许多方法参数,只需在方法树调用的开头传递一个对象,并用参数填充它.这样您就不必修改传递的每个方法来添加\删除参数.这是一个适用于所有具有函数的编程语言的概念.
首先,请查看此页面上的信息.
我经历过的三件事可以让你失望的是:
多次呼叫外部服务
在循环中调用SpreadsheetApp.flush()以强制更新工作表.
调用Range.getValue()很多.
对于第一部分,请尝试批量拨打电话.例如,如果您要求本地货币和外国货币的汇率,请尝试在一个请求中发送一堆查询.
对于第二部分,除非确实需要,否则不要调用此方法.
对于第三部分,尝试修改您的代码,以便您可以调用此方法一次并使用其结果移动而不是在多个方法中调用它以获得相同的结果.
提示:要避免修改许多方法参数,只需在方法树调用的开头传递一个对象,并用参数填充它.这样您就不必修改传递的每个方法来添加\删除参数.这是一个适用于所有具有函数的编程语言的概念.