Google Apps 脚本:无法将 URL 参数从 doGet() 传递到 doPost()

Google Apps Script: Trouble Passing URL Params from doGet() to doPost()

我无法将变量从 doGet() 传递到 doPost()。当变量 sheetName 是全局定义的,没有任何逻辑来定义它时,它工作正常,但是当我使用 doGet() 使用 URL 参数定义它时,它不会加载表单将数据提交到我的 Google Sheet。基本上,我正在尝试定义 sheet 名称,这样我就可以在同一个 sheet 中为单独的选项卡重用代码。将 sheetName 更改为 'Sheet2' 工作正常并将数据传递到 sheet (假设 headers 设置正确)。我觉得这可能是 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 的值,然后 return 将其发送给用户。在 returning 之后,脚本完成执行并且不再定义 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()
  }
}