针对谷歌应用程序脚本的Java脚本优化



下面的工作代码比较了来自两个不同工作表的两组数据。一个是395个电话号码的列表,第二个是大约135000行数据的列表。下面的代码比较两者的相似性,并将相似的行复制到第三张表中。

虽然该代码确实适用于小规模测试,(1000行和395个电话号码(只需大约10分钟。然而,执行135000行会使脚本超时。这是下面的脚本。

`function copyRowtoSheet3() { 
var s1 = SpreadsheetApp.openById("1Aw11LiKzyezfrTQIuTsJPhUFtz8RPqLCc8FlIiy0ZlE").getSheetByName('Sheet1');
var s2 = SpreadsheetApp.openById("1Aw11LiKzyezfrTQIuTsJPhUFtz8RPqLCc8FlIiy0ZlE").getSheetByName('Sheet2'); 
var s3 = SpreadsheetApp.openById("1Aw11LiKzyezfrTQIuTsJPhUFtz8RPqLCc8FlIiy0ZlE").getSheetByName('Sheet3'); 
var values1 = s1.getDataRange().getValues();
var values2 = s2.getDataRange().getValues();
var resultArray = [];
for(var n=0; n < values1.length ; n++){
var keep = false;
for(var p=0; p < values2.length ; p++){
Logger.log(values1[n][0]+' =? '+values2[p][0]);
if( values1[n][1] == values2[p][0] ){
resultArray.push(values1[n]);
Logger.log('true');
//break ;
}
}
}  
s3.getRange(+1,1,resultArray.length,resultArray[0].length).setValues(resultArray);
}`

我不擅长优化代码,如果有任何建议可以在这里输入,我会很高兴的。我查看了最佳实践,并已尽我所能加以应用。对这里的代码有什么建议吗?

  • 您想要比较"Sheet1"的列"B"one_answers"Sheet2"的列"A">
  • 当"Sheet1"的"B"列和"Sheet2"的"A"列的值相同时,您需要将"Sheet1"行放在"Sheet3"中
  • 您希望降低脚本的处理成本
  • 你想使用谷歌应用程序脚本来实现这一点

如果我的理解是正确的,这个答案怎么样?请将此视为几种可能的答案之一。

修改要点:

  • 请使用SpreadsheetApp.openById("1Aw11LiKzyezfrTQIuTsJPhUFtz8RPqLCc8FlIiy0ZlE")一次
  • 在您的情况下,在for循环中使用values2。因此CCD_ 3被循环到CCD_ 4的每个元素。
    • 为此,准备了一个用于搜索值的对象
  • 如果resultArray的长度较大,则可以使用Sheets API而不是像SpreadsheetApp这样的电子表格服务来降低工艺成本。参考

当以上几点反映到脚本中时,流程如下。

流量:
  1. 从"Sheet1"one_answers"Sheet2"中检索值
  2. 使用values2创建一个对象
  3. 使用values1和对象创建resultArray
  4. 使用表格API中的spreadsheets.values.update方法将resultArray置于"表格3"中

修改的脚本:

在使用此脚本之前,请在高级Google服务中启用Sheets API。

function copyRowtoSheet3() {
var spreadsheetId = "1Aw11LiKzyezfrTQIuTsJPhUFtz8RPqLCc8FlIiy0ZlE";
var ss = SpreadsheetApp.openById(spreadsheetId);
var s1 = ss.getSheetByName('Sheet1');
var s2 = ss.getSheetByName('Sheet2');
// 1. Retrieve values from "Sheet1" and "Sheet2",
var values1 = s1.getDataRange().getValues();
var values2 = s2.getRange(1, 1, s2.getLastRow(), 1).getValues();
// 2. Create an object using values2.
var obj = values2.reduce((o, [e]) => {
o[e] = null;
return o;
}, {});
// 3. Create resultArray using values1 and obj.
var resultArray = values1.filter(([,b]) => b in obj);
// 4. Put resultArray to Sheet3.
Sheets.Spreadsheets.Values.update({values: resultArray}, spreadsheetId, "Sheet3", {valueInputOption: "USER_ENTERED"});
}

注:

  • 在这种情况下,请在脚本编辑器中启用V8

参考文献:

  • 基准:使用谷歌应用程序脚本阅读和编写电子表格
  • 高级谷歌服务
  • 方法:spreadsheets.values.update

如果我误解了你的问题,而这不是你想要的结果,我道歉。

最新更新