Html表单:Select多个,只提交一个值
Html form: Select multiple, only one value is submitted
来自点差sheet
https://docs.google.com/spreadsheets/d/1fuQK9VYk_rV9bO8DvL7iBHiupBtDmbqrv-GV-dirRTk/edit?usp=sharing
我创建了 html 表单
https://script.google.com/macros/s/AKfycbzIKY4rg0Fp5wvaqov5SIK9_je4aJn4tqY9lsbwKCtLropgSrw/exec
问题是当我选择多个选项时,只有一个选项(第一个选择的)被提交给sheet
.html
<!DOCTYPE html>
<html>
<body>
<style>
</style>
<form name="submit-to-google-sheet" id="form" action="script URL" method="POST">
<select name="Options" id="Options" aria-required="true" required="" size="4" multiple="multiple">
<option value="option1">option1</option>
<option value="option2">option2</option>
<option value="option3">option3</option>
<option value="option4">option4</option>
<option value="option5">option5</option>
<option value="option6">option6</option>
</select>
<input type="submit" value="Submit"></form>
</body>
</html>
我试图将输入名称更改为这个 name="Options[]"
但它在 sheet
中给出未定义
.gs
function doGet() {
return HtmlService.createTemplateFromFile('Form.html')
.evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
var sheetName = 'Sheet1'
var scriptProp = PropertiesService.getScriptProperties()
function doPost (e) {
var lock = LockService.getScriptLock()
lock.tryLock(10000)
try {
var doc = SpreadsheetApp.getActive();
var sheet = doc.getSheetByName(sheetName)
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
var nextRow = sheet.getLastRow() + 1
var newRow = headers.map(function(header) {
return header === 'Timestamp' ? new Date() : e.parameter[header]
})
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
return ContentService
.createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow }))
.setMimeType(ContentService.MimeType.JSON)
}
catch (e) {
return ContentService
.createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
.setMimeType(ContentService.MimeType.JSON)
}
finally {
lock.releaseLock()
}
}
任何想法。谢谢
要检索 post 值,您需要使用 e.postData.contents
而不是 e.parameter
,这只会 return 您每个 field/parameter [1] 一个值:
Only the first value is returned for parameters that have multiple
values.
使用表单并将数据发送到服务器的更好方法(更简单和安全)是使用 withSuccessHandler
函数 [2] 而不是使用表单元素上的 action 属性。
[1] https://developers.google.com/apps-script/guides/web#request_parameters
[2]https://developers.google.com/apps-script/guides/html/communication
来自点差sheet
https://docs.google.com/spreadsheets/d/1fuQK9VYk_rV9bO8DvL7iBHiupBtDmbqrv-GV-dirRTk/edit?usp=sharing
我创建了 html 表单
https://script.google.com/macros/s/AKfycbzIKY4rg0Fp5wvaqov5SIK9_je4aJn4tqY9lsbwKCtLropgSrw/exec
问题是当我选择多个选项时,只有一个选项(第一个选择的)被提交给sheet
.html
<!DOCTYPE html>
<html>
<body>
<style>
</style>
<form name="submit-to-google-sheet" id="form" action="script URL" method="POST">
<select name="Options" id="Options" aria-required="true" required="" size="4" multiple="multiple">
<option value="option1">option1</option>
<option value="option2">option2</option>
<option value="option3">option3</option>
<option value="option4">option4</option>
<option value="option5">option5</option>
<option value="option6">option6</option>
</select>
<input type="submit" value="Submit"></form>
</body>
</html>
我试图将输入名称更改为这个 name="Options[]"
但它在 sheet
.gs
function doGet() {
return HtmlService.createTemplateFromFile('Form.html')
.evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
var sheetName = 'Sheet1'
var scriptProp = PropertiesService.getScriptProperties()
function doPost (e) {
var lock = LockService.getScriptLock()
lock.tryLock(10000)
try {
var doc = SpreadsheetApp.getActive();
var sheet = doc.getSheetByName(sheetName)
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
var nextRow = sheet.getLastRow() + 1
var newRow = headers.map(function(header) {
return header === 'Timestamp' ? new Date() : e.parameter[header]
})
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
return ContentService
.createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow }))
.setMimeType(ContentService.MimeType.JSON)
}
catch (e) {
return ContentService
.createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
.setMimeType(ContentService.MimeType.JSON)
}
finally {
lock.releaseLock()
}
}
任何想法。谢谢
要检索 post 值,您需要使用 e.postData.contents
而不是 e.parameter
,这只会 return 您每个 field/parameter [1] 一个值:
Only the first value is returned for parameters that have multiple values.
使用表单并将数据发送到服务器的更好方法(更简单和安全)是使用 withSuccessHandler
函数 [2] 而不是使用表单元素上的 action 属性。
[1] https://developers.google.com/apps-script/guides/web#request_parameters
[2]https://developers.google.com/apps-script/guides/html/communication