对话界面跟进

时间:2019-04-28 02:38:51

标签: google-apps-script google-sheets

这是我发布的有关产品订购系统的上一个问题的后续措施。目前,为解决原始问题而编写的代码在修改为我的需求后不起作用,并且我无法找出问题。

我尝试了许多方法,但无法弄清楚是什么原因导致订单无法复制到订单中。

这是当前对话框形式: enter image description here

这是当前的订单(应将订单复制到的位置): enter image description here

这是对话框从中提取数据的零件列表: enter image description here

这是moveToOrder调试日志: enter image description here 这是完整的code.gs页面(其他html页面完全没有更改)

function clearOrder(){

  //Clears the Current Order Form and Quantities
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  var setsheet = spreadsheet.setActiveSheet(spreadsheet.getSheets()[1])
  var toclear = setsheet.getRange("E2:E100")
  var clear = toclear.clearContent()
  var ss = spreadsheet.setActiveSheet(spreadsheet.getSheets()[0])
  var clearRange = ss.getRange("A4:E100")
  var clearData = clearRange.clearContent()
  var dateRange = ss.getRange("A1:E1")
  var clearDate = dateRange.clearContent()


}

function printOrder(){

  //Selects the Applicable Cells to be Printed
  var ss = SpreadsheetApp.getActiveSheet()
  var dateRange = ss.getRange("C1:E1")
  var currentDate = new Date();
  var formatDate = dateRange.setNumberFormat("dddd, m/d/yy");
  var addDate = dateRange.setValue(currentDate)
  var textRange = ss.getRange("A1:B1")
  var addText = textRange.setValue("Order Compiled On:")
  var lastRow = ss.getLastRow()
  var finRange = ss.getRange("A1:E"+ lastRow)
  var printRange = ss.setActiveRange(finRange)


}



function onOpen() {
  SpreadsheetApp.getUi().createMenu('Order Materials')
  .addItem('Show Order Dialog', 'displayOrderDialog')
  .addToUi();
}

function include(filename){
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

function displayOrderDialog() {
  var userInterface=HtmlService.createTemplateFromFile('dialog').evaluate().setWidth(600).setHeight(300).setTitle('Inventory');
  SpreadsheetApp.getUi().showModelessDialog(userInterface,'Product List');
  SpreadsheetApp.getActive().getSheetByName('Order').activate();
}

function getInventory() {//show order dialog for selecting parts
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Part List');
  var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
  var pA=rg.getValues();
  var html="<style>td,th{border:1px solid black;}</style><table>";
  html+='<tr><th>Brand</th><th>Product Description</th><th>Size and Type</th><th>Item Number</th><th>Quantity</th><th>&nbsp;</tr>';
  for(var i=0;i<pA.length;i++) {    
       html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td><input type="text" value="%s" id="%s" size="6" /></td><td><input type="button" value="Order" onClick="moveToOrder(\'%s\',\'%s\');"/></tr>',pA[i][0],pA[i][1],pA[i][2].toString().replace(/(")/g,'\\"'),pA[i][3],pA[i][4],Number(i+2),pA[i][2],i+2);
  }

  html+='</table>';
  var orderObj={html:html};
  return orderObj;
}

function moveToOrder(orderObj) { //moves selected part to active page so make sure your on the right order form
  //orderObj['remaining']=debitInventory(orderObj);

  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Part List');
  var rg=sh.getRange(2,1,1,4);
  var pA=rg.getValues();
  var osh=ss.getSheetByName('Order');
  pA[0].splice(pA[0].length,0,orderObj.quantity);
  osh.appendRow(pA[0]);
  return orderObj;
}

printOrder和clearOrder函数由我编写,与订单对话框无关,但是我认为完整的表格是最好的。谢谢。

这里是工作表副本的链接(您应该可以从那里访问代码)。随时编辑,但需要:

Spreadsheet Link    Script Link

1 个答案:

答案 0 :(得分:0)

您似乎在零件列表中添加了一列,但没有为该<td></td>添加值,所以我认为这可能会解决一个问题html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td><input type="text" value="%s" id="%s" size="6" /></td><td><input type="button" value="Order" onClick="moveToOrder(\'%s\',\'%s\');"/></tr>',pA[i][0],pA[i][1],pA[i][2],pA[i][3],pA[i][4],"inv-"+ Number(i+2),pA[i][2],i+2,"q-"+ Number(i+2));

我还注意到,现在您的大小和类型以及其他位置都有引号,因此我认为您必须在数据中搜索引号并将其转义,这可能就是为什么现在不复制的原因。但老实说,我不确定。

您的尺寸和类型数据内有引号,如下所示:

enter image description here

最有可能收到格式错误的html错误。

您可能可以使用类似pA[i][2].toString().replace(/"/g,'\\"');

因此html行变成这样:

html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td><input type="text" value="%s" id="%s" size="6" /></td><td><input type="button" value="Order" onClick="moveToOrder(\'%s\',\'%s\');"/></tr>',pA[i][0],pA[i][1],pA[i][2].toString().replace(/(")/g,'\\"'),pA[i][3],pA[i][4],"inv-"+ Number(i+2),pA[i][2],i+2,"q-"+ Number(i+2));

我尽力使这一点变得清楚。我以略有不同的方式重写了代码,以便可以使用标题列标题来标识数据。

function getInventory() {//show order dialog for selecting parts
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Part List');
  var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());
  var pA=rg.getValues();
  var dObj={};
  var hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0].map(function(r){return r.replace(/ /g,'');});
  var html="<style>td,th{border:1px solid black;}</style><table>";
  html+='<tr><th>Brand</th><th>Product Description</th><th>Size and Type</th><th>Item Number</th><th>Quantity</th><th>&nbsp;</tr>';
  for(var i=0;i<pA.length;i++) {  
    for(var j=0;j<pA[i].length;j++) {
      dObj[hA[i][j]]=pA[i][j];
    }  
    html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td><input type="text" value="%s" id="%s" size="6" /></td><td><input type="button" value="Order" onClick="moveToOrder(\'%s\',\'%s\');"/></tr>',dObj.Brand,dObj.ProductDescription,dObj.SizeandType.replace(/(")/g,'\\"'),dObj.ItemNumber,dObjQuantity,'q-' + Number(i+2),dObj.ItemNumber,i+2);
  }
  html+='</table>';
  var orderObj={html:html};
  return orderObj;
}

这是一个草图,希望可以帮助您了解这里的情况。

enter image description here

从我的角度来看,我不确定它是否有帮助。但是我现在就走。