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

问题描述 投票:0回答:1

我无法将变量从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()
  }
}
javascript google-apps-script google-sheets google-sheets-api google-sheets-macros
1个回答
0
投票

向脚本发送GET请求时,它将设置sheetName的值,然后将其返回给用户。返回后,脚本完成执行,并且不再定义sheetName

然后,当您收到POST请求另一个时,将执行脚本的单独实例,因此sheetName未定义。

变量仅保留单个执行实例的值。要在各个执行中保留值,应保存到Properties

Properties
© www.soinside.com 2019 - 2024. All rights reserved.