我一直在创建库存电子表格,以帮助我父亲的员工获得年终库存。填写库存的用户将数据输入标题为" 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");
}
}
答案 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()函数。它非常有用,可以查看执行日志。
如果这不是特别有用,请给我留言,我会删除它,因为我认为人们更倾向于回答那些没有多少答案的问题。