Javascript 提高我的脚本性能和速度-谷歌应用程序脚本

Javascript 提高我的脚本性能和速度-谷歌应用程序脚本,javascript,performance,optimization,google-apps-script,spreadsheet,Javascript,Performance,Optimization,Google Apps Script,Spreadsheet,我有45000行“原始数据”表中的数据。所以我创建了一个函数,每当我运行这个函数时,它都会将我的数据分组到透视表中,透视表可能有500行,并转换为新格式,但总共需要30分钟以上 function sumData() { var spreadsheet = SpreadsheetApp.getActive(); var ss = SpreadsheetApp.getActive().getSheetByName('Raw data'); var sourceData = spreads

我有45000行“原始数据”表中的数据。所以我创建了一个函数,每当我运行这个函数时,它都会将我的数据分组到透视表中,透视表可能有500行,并转换为新格式,但总共需要30分钟以上

function sumData() {
  var spreadsheet = SpreadsheetApp.getActive();
  var ss = SpreadsheetApp.getActive().getSheetByName('Raw data');
  var sourceData = spreadsheet.getRange('A1:I100000');
  var pivotTable = spreadsheet.getRange('A1').createPivotTable(sourceData);
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Pivot table'), true);
  sourceData = spreadsheet.getRange('\'Raw data\'!A1:I100000');
  pivotTable = spreadsheet.getRange('A1').createPivotTable(sourceData);
  var pivotValue = pivotTable.addPivotValue(3, SpreadsheetApp.PivotTableSummarizeFunction.COUNTA);
  pivotGroup = pivotTable.addRowGroup(6);
  pivotGroup.showTotals(false).showRepeatedLabels();
  pivotGroup = pivotTable.addRowGroup(2);
  pivotGroup.showTotals(false).showRepeatedLabels();
  pivotGroup = pivotTable.addRowGroup(3);
  pivotGroup.showTotals(false);

  var ss1 = SpreadsheetApp.getActive().getSheetByName('Pivot table');
  var ss2 = SpreadsheetApp.getActive().getSheetByName('Summary data');
  ss2.getRange('A:D').activate();
  ss2.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true});

  ss2.setFrozenRows(1);
  var value = [["Shop order", "Part number", "count Workstation", "Workstation"]];
  var range = ss2.getRange("A1:D1");
  range.setValues(value);

  var data = ss1.getRange(1, 1).getValue()
  for(var i = 1, j = 1; i < ss1.getLastRow()+1; i++) {
    var normalCase = true
    if(i!=1) {
      if(ss1.getRange(i, 1).getValue() == data) {
        normalCase = false
        ss2.getRange(j, 3).setValue(ss1.getRange(i, 4).getValue()+ss2.getRange(j, 3).getValue()) // for update count workstation
        ss2.getRange(j, 4).setValue(ss1.getRange(i, 3).getValue()+ " = " +ss1.getRange(i, 4).getValue()+ ", " +ss2.getRange(j, 4).getValue()) // for update value 
      } else {
        j++}}
    if(normalCase) {
      ss2.getRange(j, 1).setValue(ss1.getRange(i, 1).getValue())
      ss2.getRange(j, 2).setValue(ss1.getRange(i, 2).getValue())
      ss2.getRange(j, 3).setValue(ss1.getRange(i, 4).getValue())
      ss2.getRange(j, 4).setValue(ss1.getRange(i, 3).getValue()+ " = " +ss1.getRange(i, 4).getValue())}
    data = ss1.getRange(i, 1).getValue()}
  ss2.deleteRow(2);
  var ui = SpreadsheetApp.getUi();
  ui.alert('Summarize complete.');
};
函数sumData(){
var电子表格=SpreadsheetApp.getActive();
var ss=SpreadsheetApp.getActive().getSheetByName(“原始数据”);
var sourceData=spreadsheet.getRange('A1:I100000');
var pivotTable=spreadsheet.getRange('A1')。createPivotTable(sourceData);
电子表格.setActiveSheet(电子表格.getSheetByName('Pivot table'),true);
sourceData=spreadsheet.getRange(“\'Raw data\'!A1:I100000”);
数据透视表=电子表格。getRange('A1')。创建数据透视表(sourceData);
var pivotValue=pivotTable.addPivotValue(3,SpreadsheetApp.PivotTablesSummarizeFunction.COUNTA);
数据透视组=数据透视表。addRowGroup(6);
pivotGroup.showTotals(false).showRepeatedLabels();
数据透视组=数据透视表。addRowGroup(2);
pivotGroup.showTotals(false).showRepeatedLabels();
数据透视组=数据透视表。addRowGroup(3);
数据透视组。显示总计(false);
var ss1=SpreadsheetApp.getActive().getSheetByName('Pivot table');
var ss2=SpreadsheetApp.getActive().getSheetByName(“摘要数据”);
ss2.getRange('A:D').activate();
ss2.getActiveRangeList().clear({contentsOnly:true,skipFilteredRows:true});
ss2.设置冻结行(1);
var值=[“车间订单”、“零件号”、“计数工作站”、“工作站”];
var范围=ss2.getRange(“A1:D1”);
范围。设置值(值);
var data=ss1.getRange(1,1).getValue()
对于(变量i=1,j=1;i

有没有办法让我的代码运行得更快,或者只是让脚本在10-15分钟内运行?

这些信息对您的情况有用吗?一个比多个快
setValue
s请向我们提供数据样本,以便我们能够重现您的情况(ofc,请用虚拟信息替换任何个人数据)。除上述方法外,
getRange()
getValue
也是很重的方法,您不应该将它们放入循环中(使用单个
getValues()
,然后在内存中的
数组上进行操作,完成后->
setValues()
一次)