Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.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
Javascript 应用程序脚本执行.setValues()需要20秒_Javascript_Google Apps Script - Fatal编程技术网

Javascript 应用程序脚本执行.setValues()需要20秒

Javascript 应用程序脚本执行.setValues()需要20秒,javascript,google-apps-script,Javascript,Google Apps Script,我很难理解为什么这需要如此长的时间来执行,以及是否有解决方案。执行.setValues()行需要20秒。网格大约是2000(行)乘100(列)个单元格 这里有一个链接到测试材料的链接,就像我的数据集一样 function test() { var active = SpreadsheetApp.getActiveSpreadsheet(); var logs_sheet = active.getSheetByName("Logs"); logs_sheet.appen

我很难理解为什么这需要如此长的时间来执行,以及是否有解决方案。执行.setValues()行需要20秒。网格大约是2000(行)乘100(列)个单元格

这里有一个链接到测试材料的链接,就像我的数据集一样

function test() {

    var active = SpreadsheetApp.getActiveSpreadsheet();

    var logs_sheet = active.getSheetByName("Logs");
    logs_sheet.appendRow([new Date(), "", "", "STARTING EXECUTION"]);

    var test_sheet = active.getSheetByName("Test");
    var test_data = test_sheet.getRange(1, 1, test_sheet.getLastRow(), test_sheet.getLastColumn()).getValues();

    var combine = test_data.slice();

    combine[1].splice(3, 1, new Date());

    combine.splice(2017, 1);

    combine.splice(0, 0, combine[1]);

    logs_sheet.appendRow([new Date(), "", "", "finished combine"]);

    test_sheet.getRange(1, 1, combine.length, combine[0].length).setValues(combine);

    logs_sheet.appendRow([new Date(), "", "", "FINISHED EXECUTION"]);
}

更重要的是,setValues()似乎可以很快地更新工作表,但在继续之前,它会继续运行一些不可见的内容。

我提出了一个可能的解决方案/解决方法

将数组写入Google文档进行临时存储只需0.06秒,而不是将其存储在工作表中需要20秒

我假设这可能是一个相当大的阵列,但是我还没有测试这个变通方法的限制。然而,我确实试着打开谷歌文档,这是不可能的。但是没有必要打开它

var doc_database = DocumentApp.openById(" some doc ID here ").getBody();
var old_array = JSON.parse(doc_database.getText());

doc_database.setText('');

// run old_array calcs and updates here

doc_database.setText(JSON.stringify( ... new array here .... ));
希望这个黑客可以帮助其他人

最好的
PAV

对于谷歌电子表格,这是一个巨大的网格。任何新电子表格的默认行数仅为100。如果您转到View->Execution Transcript,您将看到,即使像appendRow()这样简单的方法,在getValues()运行4秒时也要花费几乎一秒钟的时间来执行。在Excel中,可以让公式几乎在一秒钟内填充40k行。GoogleSheets是一种云服务,它仍然有很多性能限制。这个例子我可能错了,我希望看到其他人也参与进来。谢谢安东,我想知道网格是否很大。有趣的是,获取值比设置值快得多。为什么会这样?现有值可能是预缓存的,因此调用getValues()只需将它们从缓存中拉出,而不是在运行时遍历每一行和每一列。