Google表格功能部分再次运行

时间:2017-11-28 18:36:46

标签: javascript google-apps-script google-sheets

我一直在创建库存电子表格,以帮助我父亲的员工获得年终库存。填写库存的用户将数据输入标题为" Form"的表格中的几个单元格中,然后选择" SUBMIT"从表格上的下拉框中。然后,该脚本使用该表单对标题为" MSPL"的页面进行以下更改:

  • 根据
  • 形式输入的数据,在特定位置插入新行
  • 将表单中的数据复制到新行的单元格中

95%的时间都有效。但是,有时脚本似乎第二次运行自身的一部分。我已经看到电子表格实时更改并且似乎:添加新行,将数据复制到前3个单元格中,在创建的第1行上方创建第2行,将整个数据复制到此行。只有1" insertRowAfter"代码中的一行,我无法弄清楚为什么代码会插入两个。

function msplFormSubmit() {

  var form = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MSPL Form");
  var mspl = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MSPL");
  var formWIP = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MSPL WIP Form");
  var msplWIP = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MSPL WIP");
  var Pricing = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Pricing")

  if (form.getRange("E2").getValue() == "SUBMIT") {

    var sectionName = form.getRange("C5").getValue() + '"' + " " + form.getRange("C3").getValue() + " - SUBTOTAL";
    var rowSearch = mspl.getRange("B:B").getValues();
    var rowID = 0
    var unitCost = Pricing.getRange("B3:D").getValues();

    form.getRange("E2").clearContent();
    form.getRange("C10").clearContent();
    form.getRange("B10").setValue("Processing ...")

    for (i = 0; i < mspl.getLastRow(); i ++) {
      if (rowSearch[i] != sectionName) {
        rowID += 1
      } else {
        break;
      }
    }

    mspl.insertRowAfter(rowID)

    rowID += 1 //rowID now points to the newly added row, in order to populate it

    if (mspl.getRange(rowID - 1, 2, 1, 1).getBackground() === "#ffffff") {
      mspl.getRange(rowID, 2, 1, 10).setBackground("#dcdcdc")
    }
    if (mspl.getRange(rowID - 1, 2, 1, 1).getBackground() === "#dcdcdc") {
      mspl.getRange(rowID, 2, 1, 10).setBackground("#ffffff")
    }

    mspl.getRange(rowID, 2, 1, 1).setValue(form.getRange("C2").getValue()); //Tag #
    mspl.getRange(rowID, 3, 1, 1).setValue(form.getRange("C3").getValue()); //Description
    mspl.getRange(rowID, 4, 1, 1).setValue(form.getRange("C4").getValue()); //Quantity
    mspl.getRange(rowID, 5, 1, 1).setValue(form.getRange("C5").getValue()); //Thickness
    mspl.getRange(rowID, 5, 1, 1).setNote(mspl.getRange(rowID-1, 5, 1, 1).getNote()); //Thickness Note
    mspl.getRange(rowID, 6, 1, 1).setValue(form.getRange("C6").getValue()); //Width
    mspl.getRange(rowID, 7, 1, 1).setValue(form.getRange("C7").getValue()); //Length
    mspl.getRange(rowID, 8, 1, 2).setFormulasR1C1(mspl.getRange(rowID-1, 8, 1, 2).getFormulasR1C1()); //Area and Weight Formulas
    mspl.getRange(rowID, 11, 1, 1).setFormulasR1C1(mspl.getRange(rowID-1, 11, 1, 1).getFormulasR1C1()); //Cost Formula

    for (i = 0; i < unitCost.length; i ++) {
      if (unitCost[i][0] == form.getRange("C3").getValue() && unitCost[i][1] == form.getRange("C5").getValue()) {
        mspl.getRange(rowID, 10, 1, 1).setValue(unitCost[i][2]);
        break;
      }
    }

    mspl.getRange(rowID, 10 ,1, 1).setNumberFormat("$0.0000")

    form.getRange("C2:C7").clearContent();
    form.getRange("B10").clearContent();
    form.getRange("C10").setValue("READY");
    }
}

2 个答案:

答案 0 :(得分:0)

不使用数据验证和编辑可安装触发器,而是使用自定义菜单或可单击图像。有关详细信息,请参阅Custom menus in Google Sheets

另一种替代方法是在评估(form.getRange("E2").getValue() == "SUBMIT")之后/在脚本进行任何其他更改之前立即使用数据验证更改单元格的值。

答案 1 :(得分:0)

我注意到您按以下方式指定了范围:

var unitCost=Pricing.getRange("B3:D").getValues();

我认为有时这个范围可能远远超出你的数据,所以也许你可以像这样指定:

var unitCost=Pricing.getRange(3,2,Pricing.getLastRow(),4);

注意:我并不是说这就是问题,我只是通过你的代码,看看我怎么写同样的东西。

注意:

for (i=0;i<unitCost.length;i++){
      if(unitCost[i][0]==form.getRange("C3").getValue() && unitCost[i][1]==form.getRange("C5").getValue()){
        mspl.getRange(rowID, 10).setValue(unitCost[i][2]);
        break;
      }
    }

如果您的数据底部有1000行,则此代码可能需要很长时间才能运行。范围'B3:D';

你只需要在这里得到一个公式:

//mspl.getRange(rowID, 11).setFormulasR1C1(mspl.getRange(rowID-1, 11).getFormulasR1C1()); //Cost Formula
    mspl.getRange(rowID, 11).setFormulaR1C1(mspl.getRange(rowID-1,11).getFormulaR1C1()); //Cost Formula

这是您经过一些细微调整后的代码。不确定它是否值得,但我还在其中包含了一个菜单功能,可以为您节省一些时间。

//you can change this to opOpen() or connected it up to an onOpen() trigger in the edit menu/current project's triggers.
function runFormSubmitMenu(){ 
  SpreadsheetApp.getUi().createMenu('My Tools')
      .addItem('Submit', 'msplFormSubmit')
      .addToUi();
}


function msplFormSubmit(){
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var form = ss.getSheetByName("MSPL Form");
  var mspl = ss.getSheetByName("MSPL");
  var formWIP = ss.getSheetByName("MSPL WIP Form");
  var msplWIP = ss.getSheetByName("MSPL WIP");
  var Pricing = ss.getSheetByName("Pricing")

  if (form.getRange("E2").getValue()=="SUBMIT"){
    var sectionName=form.getRange("C5").getValue() + '" ' + form.getRange("C3").getValue() + " - SUBTOTAL";
    var rowSearch=mspl.getRange("B:B").getValues();
    var rowID=0;
    //var unitCost=Pricing.getRange("B3:D").getValues();
    var unitCost=Pricing.getRange(3,2,Pricing.getLastRow(),4);
    form.getRange("E2").clearContent();
    form.getRange("C10").clearContent();
    form.getRange("B10").setValue("Processing ...");

    for(var i=0;i<mspl.getLastRow();i++){
      if(rowSearch[i]!=sectionName){
        rowID++;
      } else {
        break;
      }
    }
    mspl.insertRowAfter(rowID);
    rowID++; 
    if (mspl.getRange(rowID - 1, 2).getBackground()=="#ffffff"){
      mspl.getRange(rowID, 2, 1, 10).setBackground("#dcdcdc");
    }
    if (mspl.getRange(rowID - 1, 2).getBackground()==="#dcdcdc"){
      mspl.getRange(rowID, 2, 1, 10).setBackground("#ffffff");
    }
    mspl.getRange(rowID, 2).setValue(form.getRange("C2").getValue()); //Tag #
    mspl.getRange(rowID, 3).setValue(form.getRange("C3").getValue()); //Description
    mspl.getRange(rowID, 4).setValue(form.getRange("C4").getValue()); //Quantity
    mspl.getRange(rowID, 5).setValue(form.getRange("C5").getValue()); //Thickness
    mspl.getRange(rowID, 5).setNote(mspl.getRange(rowID-1, 5, 1, 1).getNote()); //Thickness Note
    mspl.getRange(rowID, 6).setValue(form.getRange("C6").getValue()); //Width
    mspl.getRange(rowID, 7).setValue(form.getRange("C7").getValue()); //Length
    mspl.getRange(rowID, 8, 1, 2).setFormulasR1C1(mspl.getRange(rowID-1, 8, 1, 2).getFormulasR1C1()); //Area and Weight Formulas
    mspl.getRange(rowID, 11).setFormulaR1C1(mspl.getRange(rowID-1,11).getFormulaR1C1()); //Cost Formula


    for (i=0;i<unitCost.length;i++){
      if(unitCost[i][0]==form.getRange("C3").getValue() && unitCost[i][1]==form.getRange("C5").getValue()){
        mspl.getRange(rowID, 10).setValue(unitCost[i][2]);
        break;
      }
    }
    mspl.getRange(rowID,10).setNumberFormat("$0.0000");
    form.getRange("C2:C7").clearContent();
    form.getRange("B10").clearContent();
    form.getRange("C10").setValue("READY");
    }
}

你可能需要自己解决这个问题。尝试使用Logger.log()函数。它非常有用,可以查看执行日志。

如果这不是特别有用,请给我留言,我会删除它,因为我认为人们更倾向于回答那些没有多少答案的问题。