如何在通过 HTML 表单提交数组时在 Google 应用程序脚本中的 doGet(e) 函数中获取 e.parameter.array()

How to get e.parameter.array() in doGet(e) funtion in Google app script while submitting an array via HTML Form

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

这里是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、日期打印到 sheet,但 C 列变空了

电子表格中出现空白条目的原因有两个。

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

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

    An object of key/value pairs that correspond to the request parameters. Only the first value is returned for parameters that have multiple values.

而是使用 e.parameters。请注意末尾的 's',它将 return 一个已选中的复选框值数组。如上面的文档所述。

所以不是下面的:

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)
}

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

参考文献: