我无法将变量从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()
  }
}

07-28 04:57