通过 Google Sheets 中的应用程序脚本将发票信息从条目表传输到数据表

问题描述 投票:0回答:1

我编写了一个代码,将信息从条目表传输到数据表, 问题是条目表中的发票可能包含 100 行要转移, 当我尝试这种方式时,当用户写入超过 10 行时,程序会变得更慢。

function Entry() {
  var SS=SpreadsheetApp.getActiveSpreadsheet();
  var EE=SS.getSheetByName("entry");
  var DataSheet=SS.getSheetByName("data");
  var Blankrow=DataSheet.getLastRow()+1;
  var Blankrow2=DataSheet.getLastRow()+2;
  var Blankrow3=DataSheet.getLastRow()+3;
  var Blankrow4=DataSheet.getLastRow()+4;
 
  var EE2=EE.getRange("D6").getValue();
  var EE3=EE.getRange("D7").getValue();
  var EE4=EE.getRange("D8").getValue();

  DataSheet.getRange(Blankrow,1).setValue(EE.getRange("D3").getValue());
  DataSheet.getRange(Blankrow,2).setValue(EE.getRange("F3").getValue());
  DataSheet.getRange(Blankrow,3).setValue(EE.getRange("D5").getValue());
  DataSheet.getRange(Blankrow,4).setValue(EE.getRange("E5").getValue());
  DataSheet.getRange(Blankrow,5).setValue(EE.getRange("G5").getValue());
  
  if(EE2!=""){
  DataSheet.getRange(Blankrow2,1).setValue(EE.getRange("D3").getValue());
  DataSheet.getRange(Blankrow2,2).setValue(EE.getRange("F3").getValue());
  DataSheet.getRange(Blankrow2,3).setValue(EE.getRange("D6").getValue());
  DataSheet.getRange(Blankrow2,4).setValue(EE.getRange("E6").getValue());
  DataSheet.getRange(Blankrow2,5).setValue(EE.getRange("G6").getValue());
  }
  if(EE3!=""){
  DataSheet.getRange(Blankrow3,1).setValue(EE.getRange("D3").getValue());
  DataSheet.getRange(Blankrow3,2).setValue(EE.getRange("F3").getValue());
  DataSheet.getRange(Blankrow3,3).setValue(EE.getRange("D7").getValue());
  DataSheet.getRange(Blankrow3,4).setValue(EE.getRange("E7").getValue());
  DataSheet.getRange(Blankrow3,5).setValue(EE.getRange("G7").getValue());
  }
if(EE4!=""){
  DataSheet.getRange(Blankrow4,1).setValue(EE.getRange("D3").getValue());
  DataSheet.getRange(Blankrow4,2).setValue(EE.getRange("F3").getValue());
  DataSheet.getRange(Blankrow4,3).setValue(EE.getRange("D8").getValue());
  DataSheet.getRange(Blankrow4,4).setValue(EE.getRange("E8").getValue());
  DataSheet.getRange(Blankrow4,5).setValue(EE.getRange("G8").getValue()); 
  }

  EE.getRange("D3").clearContent();
  EE.getRange("H3").clearContent();
  EE.getRange("J3").clearContent();
  EE.getRange("D5:D23").clearContent();
  EE.getRange("E5:E23").clearContent();
  EE.getRange("G5:G23").clearContent();
}

我想要一种让代码运行得更快的方法。

javascript google-sheets google-apps-script
1个回答
0
投票

我相信您的目标如下。

  • 您希望减少脚本的处理成本。
  • 在你的实际情况中,有100行脚本,如
    DataSheet.getRange(Blankrow,1).setValue(EE.getRange("D3").getValue());
  • clearContent()
    的范围始终是
    "D3", "H3", "J3", "D5:E23", "G5:G23"
    的常数。

既然如此,下面的修改如何?

修改后的脚本:

function Entry2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var srcSheet = ss.getSheetByName("entry");
  var dstSheet = ss.getSheetByName("data");
  var srcLastRow = srcSheet.getLastRow();
  var [[d3, , f3], , ...srcValues] = srcSheet.getRange("D3:G" + srcLastRow).getValues();
  var temp = Array(5).fill(null);
  var dstValues = srcValues.map(([d, e, , g]) => d.toString() ? [d3, f3, d, e, g] : temp);
  if (dstValues.length == 0) return;
  dstSheet.getRange(dstSheet.getLastRow() + 1, 1, dstValues.length, dstValues[0].length).setValues(dstValues);
  srcSheet.getRangeList(["D3", "H3", "J3", "D5:E23", "G5:G23"]).clearContent();
}
  • 在您的脚本中,例如,当
    if(EE2!="")
    为 false 时,
    var Blankrow2=DataSheet.getLastRow()+2
    的行为空。我通过反思修改了你的脚本。

注:

  • 当我使用简单的示例电子表格测试您的显示脚本时,我确认修改后的脚本的结果与您的脚本相同。但是,如果这不是您预期的结果,您可以提供示例电子表格吗?借此,我想确认一下。
© www.soinside.com 2019 - 2024. All rights reserved.