总之,加快谷歌片脚本下面的代码?(Anyway to speed up the following

2019-10-28 12:51发布

我是相当新的在谷歌的脚本编码,因此你可能会看到下面的代码,并与当前的低效率摇头哈哈。 在这个短码被检查的细胞的A5至D5的值,看是否其在主列表与E5和F5的相同的值。 如果没有它,然后拷贝A5-D5到另一个工作簿中两个不同的列表。 代码工作的时刻,但我想知道是否有无论如何要加快步伐? 它要通过在iPad上的IOS表格应用,主要触发。(所以为什么我不得不改用onEdit一个按钮来触发)。 当它的检查,看看它的名单已经在其上的本地表在同一工作簿是通过从外部工作簿的公式更新。 您可以提供任何帮助将不胜感激。 就像我说的,虽然我是新来的编码我管理的时候我遇到了一个问题,从谷歌的帮助拼凑这一个。

function onEdit(e) {
var sheet1 = SpreadsheetApp.getActive().getSheetByName("sheet1")
var SiteName = sheet1.getRange("A5").getValue()
var Type = sheet1.getRange("B5").getValue()
var Fleet = sheet1.getRange("C5").getValue()
var Rego = sheet1.getRange("D5").getValue()
var Inside = sheet1.getRange("E5").getValue()
var Outside = sheet1.getRange("F5").getValue()
var User = sheet1.getRange("A3").getValue()
var master = SpreadsheetApp.getActive().getSheetByName("Master Wash List");
var True = true
var False = false
var mastermaster = SpreadsheetApp.openById("links to external workbook2").getSheetByName("master")
var mastertolocal = SpreadsheetApp.openById("links to external workbook2").getSheetByName("MasterToLocal")
var sheet = SpreadsheetApp.getActive().getSheetByName("Master Wash List");
var lastrow = sheet.getLastRow()
var SubmitButton = SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("G5").getValue()
if(Inside == True) {
for(var x = 1; x < lastrow+1;x++) {
  var cell = master.getRange(x,3).getValue()
  var masterinside = master.getRange(x, 4).getValue()
  var masteruser = master.getRange(x,6).getValue()
  if(Fleet == cell && masterinside != "N/A"){
    SpreadsheetApp.getActive().getSheetByName("sheet1").insertRowAfter(6)
    SpreadsheetApp.getActive().getSheetByName("sheet1").getRange(7,1).setValue([cell + " has already been Internally washed on " + masterinside + " by " + masteruser])
    SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("G5").setValue("false")
    }
}
}
if(Outside == True) {
for(var y = 2; y < lastrow+1;y++) {
  var cell = master.getRange(y,3).getValue()
  var masteroutside = master.getRange(y, 5).getValue()
  var User1 = master.getRange(y, 6).getValue()
  if(Fleet == cell && masteroutside != "N/A"){
    SpreadsheetApp.getActive().getSheetByName("sheet1").insertRowAfter(6)
    SpreadsheetApp.getActive().getSheetByName("sheet1").getRange(7,1).setValue([cell + " has already been externally washed on " + masteroutside + " by " + User1])
    SpreadsheetApp.getActive().getSheetByName("sheet1").deleteRows(17,2)
    SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("F5").setValue("false")}
}
}
if(SubmitButton == True){
if(Inside == True && Outside == True && Fleet != "" ) {
      mastermaster.appendRow([SiteName, Type, Fleet, Rego, new Date(), new Date(), User,])
      mastertolocal.appendRow([SiteName, Type, Fleet, Rego, "N/A", new Date(), User])
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("E5").setValue("false")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("F5").setValue("false")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("G5").setValue("false")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("A5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("B5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("C5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("D5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").insertRowAfter(6)
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange(7,1).setValue([Fleet + " has successfully been Washed Internally & Externally."])
      SpreadsheetApp.getActive().getSheetByName("sheet1").deleteRows(17, 2)}
else if(Outside == True && Fleet != "" ) {
      mastermaster.appendRow([SiteName, Type, Fleet, Rego,"N/A", new Date(), User])
      mastertolocal.appendRow([SiteName, Type, Fleet, Rego, "N/A", new Date(), User])
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("F5").setValue("false")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("G5").setValue("false")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("A5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("B5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("C5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("D5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").insertRowAfter(6)
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange(7,1).setValue([Fleet + " has successfully been Washed Externally."])
      SpreadsheetApp.getActive().getSheetByName("sheet1").deleteRows(17, 2) }
else if(Inside == True && Fleet != "") {
      mastermaster.appendRow([SiteName, Type, Fleet, Rego, new Date(), "N/A", User])
      mastertolocal.appendRow([SiteName, Type, Fleet, Rego, new Date(), "N/A", User])
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("E5").setValue("false")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("G5").setValue("false")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("A5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("B5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("C5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("D5").setValue("")
      SpreadsheetApp.getActive().getSheetByName("sheet1").insertRowAfter(6)
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange(7,1).setValue([Fleet + " has successfully been Washed Internally."])
      SpreadsheetApp.getActive().getSheetByName("sheet1").deleteRows(17, 2)}
else if(Inside != True && Outside != True && Fleet != "") {
      SpreadsheetApp.getActive().getSheetByName("sheet1").insertRowAfter(6)
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange(7,1).setValue(["Please select if " + Fleet + " Has been washed Internally, Externally or Both"])
      SpreadsheetApp.getActive().getSheetByName("sheet1").deleteRows(17, 2)  
      SpreadsheetApp.getActive().getSheetByName("sheet1").getRange("F5").setValue("false")}
  }
}

Answer 1:

谷歌提供了一个最佳实践的资源,你绝对应该检讨。 从那里,最相关的部分是关于使用批处理操作。 不具体到谷歌Apps脚本,但一个很好的做法,是为了减少一些在你的代码的重复(见DRY原则 )。 下面是一些可以应用到整个脚本的一些具体的注意事项:

  1. 减少次数调用SpreadsheetApp.getActive()SpreadsheeApp.openById()通过将返回值到一个变量。

     var ss = SpreadsheetApp.getActive(); var externalSS = SpreadsheetApp.openById("links to external workbook2"); 
  2. 减少次数调用SpreadsheetApp.getActive().getSheetByName("sheet1")通过使用您已经创建的变量sheet1 。 您可以使用查找和替换,一切以解决这个问题。

  3. 减少的次数调用getValue()通过使用getValues()代替和访问数组值。

     var row5 = sheet1.getRange(1, 1, 1, 7).getValues(); // A5:G5 var SiteName = row5[0][0]; // A5 var Type = row5[0][1]; // B5 var Fleet = row5[0][2]; // C5 var Rego = row5[0][3]; // D5 var Inside = row5[0][4]; // E5 var Outside = row5[0][5]; // F5 
  4. truefalse是在JavaScript常数,因此没有必要将它们放到变量TrueFalse
  5. 减少次数调用new Date()通过将其放置在一个变量;

     var now = new Date(); 
  6. 与之相似点3,减少调用的次数setValue()的,而不是使用setValues()

     row5.setValues([ // row5 previously defined A5:G5 [""], // A5 [""], // B5 [""], // C5 [""], // D5 [false], // E5 [false], // F5 [false] //G5 ]); 

我写了上面的例子只是一个例子,但它们都是基于你的代码。 你需要通过你的整个脚本,并找出究竟如何不破坏你的脚本的功能应用这些原则。



文章来源: Anyway to speed up the following code in google sheets script?