我有一个
HTML
网站,提交后,会使用我现有的 Google Sheet
填充我的 App Script
。这一切都工作正常,但我遇到的问题是在我的website
中,我有一个table
,它允许多行,并且每行都有一个input
。
这是提交时发布到我的
Google Sheet
的数据
Port Main Num=No&Porting Type=PRO&Range Holder=TO POPULATE&Maintain DQ=否&线路类型=多&关联号码=01111111111&关联 号码操作=端口&关联号码=02222222222&关联号码 操作=停止&相关号码=01111122222&相关号码 操作=端口&头衔=先生&首字母=t&姓氏=测试&帐户 号码=01611111111&公司名称=测试公司&建筑物名称=&地址 第 1 行=地址第 1 行&地址第 2 行=&城镇或城市=城镇&邮政编码=BB1 1BB&移植日期=08/10/2024&主要账单号码=01611111111
但是当我检查我的
Google Sheet
时,它只填充最后输入的数字(这是我所期望的)
正如你从我的数据中看到的,我正在传递所有 3 个数字,所以我知道我需要一个
loop
,但我在网上找不到任何帮助来帮助我解决这个问题。我能找到的唯一帮助是在电子表格中循环单元格。
这是我当前的
App Script
代码
const DATA_ENTRY_SHEET_NAME = "Sheet1";
const TIME_STAMP_COLUMN_NAME = "Date";
const REF_COLUMN_NAME = "Ref";
const CUST_EMAIL_COLUMN_NAME = "Email Address";
const PORTING_TIME_COLUMN_NAME = "Porting Time";
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(DATA_ENTRY_SHEET_NAME);
const doPost = (request = {}) => {
const { postData: { contents, type } = {} } = request;
var data = parseFormData(contents);
appendToGoogleSheet(data);
return ContentService.createTextOutput(contents).setMimeType(ContentService.MimeType.JSON);
};
function parseFormData(postData) {
var data = [];
var parameters = postData.split('&');
for (var i = 0; i < parameters.length; i++) {
var keyValue = parameters[i].split('=');
data[keyValue[0]] = decodeURIComponent(keyValue[1]);
}
return data;
}
function appendToGoogleSheet(data) {
if (TIME_STAMP_COLUMN_NAME !== "") {
data[TIME_STAMP_COLUMN_NAME]=new Date();
}
if (sheet.getRange(sheet.getLastRow(), 2).getValue() !== 'Ref') {
var ref = sheet.getRange(sheet.getLastRow(), 2).getValue().replace("Port-","");
var ref = parseFloat(ref)+1
data[REF_COLUMN_NAME]= 'Port-' + ref
} else {
data[REF_COLUMN_NAME]='Port-10000'
}
if (CUST_EMAIL_COLUMN_NAME !== "") {
data[CUST_EMAIL_COLUMN_NAME]= '[email protected]';
}
if (PORTING_TIME_COLUMN_NAME !== "") {
data[PORTING_TIME_COLUMN_NAME]= '10:00';
}
var headers = sheet.getRange(5, 1, 1, sheet.getLastColumn()).getValues()[0];
var rowData = headers.map(headerFld => data[headerFld]);
sheet.appendRow(rowData);
}
问题出在你的
parseFormData
函数上。线
data[keyValue[0]] = decodeURIComponent(keyValue[1]);
为
keyValue[0]
属性分配一个值,如果有多个表单输入字段具有相同的 name
属性,则替换可能存在的任何先前值 - 正如您的情况。
因此,一个可能的解决方案是检查是否已经存在具有该名称的数据,在这种情况下,然后将新数据附加到该属性。这可以通过三元运算符来实现,如下所示:
data[keyValue[0]] = data[keyValue[0]] ?
data[keyValue[0]].concat(', ', decodeURIComponent(keyValue[1])) :
decodeURIComponent(keyValue[1]);
我的示例使用“
,
”分隔符连接字符串。根据您想要的结果,您可以将其更改为 '\n'
或其他。
顺便问一下,您在这个函数中使用数组输出数据有什么原因吗?我相信一个物体在这里更适合1。所以这是我建议的修改函数:
const postData = "Port Main Num=No&Porting Type=PRO&Range Holder=TO POPULATE&Maintain DQ=No&Line Type=Multi&Associated Numbers=01111111111&Associated Numbers Actions=Port&Associated Numbers=02222222222&Associated Numbers Actions=Cease&Associated Numbers=01111122222&Associated Numbers Actions=Port&Title=Mr&Initial=t&Surname=Test&Account Number=01611111111&Company Name=Test Company&Building Name=&Address Line 1=Address Line 1&Address Line 2=&Town or City=Town&Postcode=BB1 1BB&Porting Date=08/10/2024&Main Billing Number=01611111111";
function parseFormData(postData) {
var data = {}; // <-- Changed this.
var parameters = postData.split('&');
for (var i = 0; i < parameters.length; i++) {
var keyValue = parameters[i].split('=');
data[keyValue[0]] = data[keyValue[0]] ?
data[keyValue[0]].concat(', ', decodeURIComponent(keyValue[1])) :
decodeURIComponent(keyValue[1]);
}
return data;
}
console.log(parseFormData(postData));
1数组 is,在 JavaScript 中,是一个对象;这正是您在函数中使用
data
数组的方式:向数组添加“隐藏”属性。