Google apps script 使用e.parameters解析数据

Google apps script 使用e.parameters解析数据,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在从JavaScript客户端接收以下格式的数据: 输入ContactDetails结构{ 电子邮件字符串 主题字符串 消息字符串 Color1[]字符串 Color2[]字符串 } 从PostForm发送的数据如下: 从网站发帖!r、 PostFrom=map[color1:[我的颜色1-1我的颜色1-2]color2:[我的颜色2-1我的颜色2-2]电子邮件:[我的电子邮件]邮件:[我的邮件]主题:[我的主题]] 因此,我认为最好的处理方法是使用e.parameters而不是e.p

我正在从JavaScript客户端接收以下格式的数据:

输入ContactDetails结构{
电子邮件字符串
主题字符串
消息字符串
Color1[]字符串
Color2[]字符串
}
PostForm
发送的数据如下:

从网站发帖!r、 PostFrom=map[color1:[我的颜色1-1我的颜色1-2]color2:[我的颜色2-1我的颜色2-2]电子邮件:[我的电子邮件]邮件:[我的邮件]主题:[我的主题]]

因此,我认为最好的处理方法是使用
e.parameters
而不是
e.parameter
,如果这是错误的方法,请纠正我

在我的GAS web应用程序中,
color1
color2
中只有第一个字段被发布在相关的电子表格列中,尽管我希望在每个列中看到2个元素的数组

当然,“代码结果”是我在执行问题中的代码后看到的,“预期结果”是我期望问题中的代码作为输出给出的结果。“目标最终结果”是我正在努力实现的最终结果,我认为如果我修改了代码以给出“预期结果”,那么按照“目标最终结果”的格式调整代码以生成所需的最终输出应该不难

我的GAS脚本是:

function doPost(e){
  output = handleResponse(e)
}

function handleResponse(e) {
  var result, message;
  // Prevent concurrent access overwriting data
  // we want a public lock, one that locks for all invocations
  var lock = LockService.getPublicLock();
  lock.waitLock(1000);  // wait 1 seconds before conceding defeat.

  // As we are passing JSON in the body, we need to unpairse it
  var jsonString = e.postData.getDataAsString();
  e.parameters = JSON.parse(jsonString);
  
  try {
    // next set where we write the data - you could write to multiple/alternate destinations
    var doc = SpreadsheetApp.openById(FILE_Id);
    var sheet = doc.getSheetByName(DATA_SHEET);
    
    // we'll assume header is in row 1 but you can override with header_row in GET/POST data
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var lastRow = sheet.getLastRow()
    var nextRow = lastRow + 1; // get next row
    var row = []; 
    if(lastRow < 10){
      RefID = "PRF.00" + lastRow
    } else {
      if(lastRow < 100){
        RefID = "PRF.0" + lastRow
      } else {
        RefID = "PRF." + lastRow
      }
    }
    // loop through the header columns
    for (i in headers){
      if (headers[i] == "Ref"){ // special case if you include a 'Timestamp' column
        row.push(RefID);
      } else { // else use header name to get data
        if (headers[i] == "Timestamp"){ // special case if you include a 'Timestamp' column
         row.push(new Date());
        } else { // else use header name to get data
          row.push(e.parameters[headers[i]]);
       }
      }
    }
    // more efficient to set values as [][] array than individually
    sheet.getRange(nextRow, 1, 1, row.length).setValues([row]);

    // return json success results
    result = true;
    message = link;
  } catch(e){
    // if error return this
    result = false;
    message = e;
  } finally { //release lock
    lock.releaseLock();
    var output = JSON.stringify({"result":result, "message": message});
  }
  return output;
}
使用以下模板中的
html
forms.html

表格提交
接触
电子邮件:

主题:

消息:

{{if.Result} //setTimeout(函数(){document.querySelector('#foo').style.display='none'},5000); {{end}
控制台输出数据为:

从网站发帖!r、 PostFrom=map[color1:[我的颜色1-1我的颜色1-2]color2:[我的颜色2-1我的颜色2-2]电子邮件:[我的电子邮件]邮件:[我的邮件]主题:[我的主题]]
详细信息={我的电子邮件我的主题我的邮件[我的颜色1-1我的颜色1-2][我的颜色2-1我的颜色2-2]}
字节表示=[123 34 69 109 97 105 108 34 58 34 109 121 32 101 109 97 105 108 34 44 34 83 117 98 106 101 99 116 34 58 34 109 121 32 115 117 98 106 101 99 116 34 44 34 77 101 115 115 97 103 101 34 58 34 109 121 32 109 101 115 115 97 103 101 34 44 34 67 111 108 111 114 49 34 58 91 34 109 121 32 99 111 108 111 114 32 49 32 45 32 49 34 44 34 109 121 32 99 111 108 111 114 32 49 32 45 32 50 34 93 44 34 67 111 108 111 114 50 34 58 91 34 109 121 32 99 111 108 111 114 32 50 32 45 32 49 34 44 34 109 121 32 99 111 108 111 114 32 50 32 45 32 50 34 93 125]

为了实现您的“预期结果”目标,下面的修改如何?在这种情况下,请修改您的Google Apps脚本的
HandlerResponse()
,如下所示

发件人: 致: 注:
  • 当您修改Web应用的脚本时,请将Web应用重新部署为新版本。这样,最新的脚本将反映到Web应用中。请注意这一点。

我可以问一下您的工作表图像中“代码结果”、“预期结果”和“目标最终结果”之间的区别吗?另外,您能否提供
bytesRepresentation的
bytesRepresentation的
示例值,err:=json.Marshal(详细信息)
?当然可以@Tanaike,“代码结果”是我在执行问题中的代码后看到的,“预期结果”是我预期问题中的代码将作为输出给出的结果。“目标最终结果”是我正在努力接近的最终结果,我认为如果我修改代码以给出“预期结果”,则不难对其进行调优,以生成所需的最终输出,格式为“Targeted final result”@Tanaike,bytesRepresentation=[123 34 69 109 97 105 108 34 58 34 109 121 32 101 109 97 105 108 34 44 34 83 117 98 106 101 99 116 34 58 34 109 121 32 115 117 98 106 101 99 116 34 44 34 77 101 115 115 97 103 101 34 58 34 109 121 32 109 101 115 115 97 103 101 34 44 34 67 111 108 111 114 49 34 58 91 34 109 121 32 99 111 108 111 114 32 49 32 45 32 49 34 44 34 109 121 32 99 111 108 111 114 32 49 32 45 32 50 34 93 44 34 67 111 108 111 114 50 34 58 91 34 109 121 32 99 111 108 111 114 32 50 32 45 32 49 34 44 34 109 121 32 99 111 108 111 114 32 50 32 45 32 50 34 93 125]谢谢你的回复。从你的回复中,我提出了一个修改点作为答案。你能确认一下吗?如果我误解了你的目标,我道歉。谢谢,“预期结果”按预期工作,如果我坚持“目标结果”会回到你身边:)
row.push(e.parameters[headers[i]]);
var temp = e.parameters[headers[i]];
row.push(Array.isArray(temp) ? temp.join(",") : temp);
// Or if you want to ensure empty objects are excluded from the .join(), you can use:
// row.push(Array.isArray(temp) ? (temp.filter(value => Object.keys(value).length !== 0)).join(",") : temp);