【问题标题】:How to get e.parameter.array() in doGet(e) funtion in Google app script while submitting an array via HTML Form如何在通过 HTML 表单提交数组时在 Google 应用脚本的 doGet(e) 函数中获取 e.parameter.array()
【发布时间】:2018-03-16 01:34:54
【问题描述】:

我正在尝试向谷歌应用脚​​本 webapp 提交带有数组的 Html 表单,但无法将数组检索到应用中。

这里是html表单代码

function onOpen(){
  SpreadsheetApp.getUi().createMenu("Send Mail").addItem("Insurance Mail", "insuranceMail").addToUi();
}

function insuranceMail(){
  var webApp = "https://script.google.com/macros/s/AKfycbwsAlL2GWySwmkGooucVmDXTJK60TLAcAgQWYAdxGumgdI2Kjs/exec";
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sh = ss.getActiveSheet();
  var row = sh.getActiveRange().getRow();
  var clientName = sh.getRange("A"+row).getDisplayValue();
  var senderID = Session.getActiveUser().getEmail();
  var clientID = sh.getRange("B"+row).getDisplayValue();
  var senderName = sh.getRange("C"+row).getDisplayValue();
  var namesOfIns = sh.getRange("D"+row).getDisplayValue().replace(/,/g,"<br>"); //Next Line Formatting
  var sub= "Additional Credentialing Options";
  var message = "";
  var date = new Date();
  var iSheet = ss.getSheetByName("Insurances");
  var iLastRow = iSheet.getLastRow();
  var insurances = [];
  var plan = [];
  var values = [];
  var tableRows = [];
  var j,count = 1,tableRow;

  for(var i = 0;i<=iLastRow;i++){
    j=i+2;
    insurances[i] = iSheet.getRange("A"+j).getDisplayValue();  //Get Insurance Names
  }
  for(var i = 0;i<=iLastRow;i++){
    j=i+2;
    plan[i] = iSheet.getRange("B"+j).getDisplayValue();  //Get Plan Names
  }
  for(var i = 0;i<=iLastRow;i++){
    j=i+2;
    values[i] = iSheet.getRange("C"+j).getDisplayValue(); // Get Yes/No values
  }

  var messageHtmlTop = "<!DOCTYPE html><html><head>"
  +"<style> table{font-size:11px;font-family:sans-serif;} tr,td {padding: 0px 0px 0px 0px;text-align:center;}</style></head>"
  +"<body>"
  +"Hello "+clientName+",<br><br>"
  +"<br><br>"
  +"Some Html"
  +"<b>"+namesOfIns+"</b><br><br>";

  var messageHtmlTop2 = "<form action ='"+webApp+"'method='GET'><input type='email' name='clientID' value='"+clientID+"' style='display: none'><input type='text' name='clientName' value='"+clientName+"' style='display: none'>"
  +"<table><tr><th>Sr. No.</th><th>Select</th><th>Insurance</th><th>Plane</th></tr>";

  var messageHtmlMid = "";

  for(n in insurances){
    if(values[n] == "Yes" || values[n] == "yes"){
      tableRow ="<tr>"
      +"<td>"+count+"</td>"
      +"<td><input type='checkbox' name='insurances[]' value='"+insurances[n]+"'></td>"
      +"<td>"+insurances[n]+"</td>"
      +"<td>"+plan[n]+"</td>"
      +"</tr>";
      tableRows[n] = tableRow;
      count++;
    }  // Creat table rows array
  } //Add Form top to the HTML on if atleast 1 Yes is present
  for(n in tableRows){
    messageHtmlMid = messageHtmlMid.concat(tableRows[n]); //Compose HTML Form Mid Part
  };

  var messageHtmlBottom1 ="<tr></tr><tr><td></td><td></td><td><input type='submit' value='Send' width=100% hieght=40px></td></tr></table>"
  +"</form><br><br>"
  +"some sentence<br><br>"

  var messageHtmlBottom ="some HTML"
  +"</body>"
  +"</html>";

  for(n in values){
    if (values[n] == 'Yes'){
      messageHtmlTop = messageHtmlTop.concat(messageHtmlTop2);
      messageHtmlBottom = messageHtmlBottom1.concat(messageHtmlBottom);
      break;
    }
  } ////Add Form bottom to the HTML on if atleast 1 Yes is present

  var messageHtml = messageHtmlTop.concat(messageHtmlMid).concat(messageHtmlBottom); //Compose Full HTML with Form

  Logger.log(messageHtml);
  try{
    MailApp.sendEmail(clientID,sub,message,{'htmlBody':messageHtml});
    sh.getRange("E"+row).setValue("Sent");
  } catch(e){
    sh.getRange("E"+row).setValue("Error");
  }
  sh.getRange("F"+row).setValue(date);
}

这是我正在尝试工作的 webapp 代码,但结果为空。

function doGet(e) {
  var name = e.parameter.clientName;
  var id = e.parameter.clientID;
  var date = new Date();
  var iSheet = SpreadsheetApp.openById("ID").getSheetByName("Responses");
  var lastRow = iSheet.getLastRow();
  var getIns =[];
  var insurances = "";

  for(n in e.parameter.insurances){
    getIns[n] = e.parameter.insurances[n];
  }
  for(n in getIns){
    insurances = insurances.concat(getIns[n]+"\n");
  }

  lastRow++;
  iSheet.getRange("A"+lastRow).setValue(name);
  iSheet.getRange("B"+lastRow).setValue(id);
  iSheet.getRange("C"+lastRow).setValue(insurances);
  iSheet.getRange("D"+lastRow).setValue(date);

  return ContentService.createTextOutput('Some Sentence').setMimeType(ContentService.MimeType.TEXT)
}

我将客户名称、客户 ID、日期打印到工作表中,但 C 列为空

【问题讨论】:

    标签: google-apps-script google-sheets html-email forms


    【解决方案1】:

    您在电子表格中得到一个空条目有两个原因。

    1. 在表单中,复选框被命名为insurances[]。但是,在 Web 应用程序中,您将它们称为 insurances。因此,请修改您的 Html,以便将复选框命名为 'insurances'

      +"<td><input type='checkbox' name='insurances' value='"+insurances[n]+"'></td>"
      
    2. 如文档 here 中所述。 e.parameter 只检索第一个键:值对

      与请求参数对应的键/值对对象。具有多个值的参数只返回第一个值。

    改为使用e.parameters。请注意末尾的“s”,它将返回已检查的复选框值数组。如上述文档中所述。

    所以而不是以下内容:

    for(n in e.parameter.insurances){
        getIns[n] = e.parameter.insurances[n];
      }
      for(n in getIns){
        insurances = insurances.concat(getIns[n]+"\n");
      }
    

    你可以这样做

    var insurances = e.parameters.insurances.join("\n")
    

    您的最终网络应用程序如下:

    function doGet(e) {
      var name = e.parameter.clientName;
      var id = e.parameter.clientID;
      var date = new Date();
      var iSheet = SpreadsheetApp.openById("ID").getSheetByName("Responses");
      var lastRow = iSheet.getLastRow();
      var getIns =[];
      var insurances = e.parameters.insurances.join("\n")
      lastRow++;
      iSheet.getRange("A"+lastRow).setValue(name);
      iSheet.getRange("B"+lastRow).setValue(id);
      iSheet.getRange("C"+lastRow).setValue(insurances);
      iSheet.getRange("D"+lastRow).setValue(date);
    
      return ContentService.createTextOutput('We have received your request').setMimeType(ContentService.MimeType.TEXT)
    }
    

    最后说明:确保更新您的网络应用并重新部署。

    参考资料:

    【讨论】:

    • 非常感谢,它的工作。我在阅读文档时错过了该参数。
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 2015-08-19
    • 2016-12-14
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多