我无法将变量从doGet()
传递到doPost()
。当全局定义变量sheetName
时,没有任何逻辑可以定义它时,它可以正常工作,但是当我使用doGet()
通过URL参数来定义它时,它不会将表单提交数据加载到我的Google表格中。基本上,我试图定义工作表名称,以便可以将代码重用于同一工作表中的单独选项卡。将sheetName
更改为'Sheet2'可以正常工作,并将数据传递到该表中(假设标题已正确设置)。我觉得这可能是在doGet()
之后调用doPost()
的加载顺序?任何帮助将不胜感激。
我正在使用的代码的基础摘自这里:https://forum.webflow.com/t/how-to-submit-html-form-directly-to-google-sheets/71432
我的scriptURL
是这样的:https://script.google.com/macros/s/KEY/exec?formUsed=Sheet1
我修改后的Code.gs
代码如下:
var sheetName;
function doGet(request){
sheetName = request.parameter.formUsed;
return ContentService.createTextOutput(sheetName);
}
//var sheetName = 'Sheet1';
var scriptProp = PropertiesService.getScriptProperties();
function setup() {
var doc = SpreadsheetApp.getActiveSpreadsheet()
scriptProp.setProperty('key', doc.getId())
}
function doPost(e) {
var lock = LockService.getScriptLock()
lock.waitLock(10000)
try {
var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'))
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()
}
}
最佳答案
当您向脚本发送GET请求时,它将设置sheetName
的值,然后将其返回给用户。返回后,脚本完成执行并且不再定义sheetName
。
然后,当您收到另一个POST请求时,将执行脚本的单独实例,因此未定义sheetName
。
变量仅保留单个执行实例的值。要在各个执行中保留值,应保存到Properties
。
var scriptProp = PropertiesService.getScriptProperties();
function doGet(request){
scriptProp.setProperty('sheetName', request.parameter.formUsed);
return ContentService.createTextOutput(sheetName);
}
function setup() {
var doc = SpreadsheetApp.getActiveSpreadsheet()
scriptProp.setProperty('key', doc.getId())
}
function doPost(e) {
var lock = LockService.getScriptLock()
lock.waitLock(10000)
try {
var doc = SpreadsheetApp.openById(scriptProp.getProperty('key'))
var sheet = doc.getSheetByName(scriptProp.getProperty('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()
}
}