简体   繁体   English

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

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

I'm having trouble getting a variable passed from doGet() into doPost() .我无法将变量从doGet()传递到doPost() When the variable sheetName is defined globally without any logic to define it, it works fine, but when I use doGet() to define it using a URL parameter, it won't load the form submission data into my Google Sheet.当变量sheetName在没有任何逻辑的情况下全局定义时,它可以正常工作,但是当我使用doGet()使用 URL 参数定义它时,它不会将表单提交数据加载到我的 Google 表格中。 Basically I'm trying to define the sheet name so I can reuse the code for separate tabs inside the same sheet.基本上我正在尝试定义工作表名称,以便我可以在同一个工作表中重复使用不同选项卡的代码。 Changing sheetName to 'Sheet2' works fine and passes the data into that sheet (assuming the headers are setup properly).sheetName更改为“Sheet2”可以正常工作并将数据传递到该工作表中(假设标题设置正确)。 I feel like it might be a load order where doGet() is getting called after doPost() or something?我觉得这可能是在doPost()之后调用doGet() () 或其他什么的加载顺序? Any help would be greatly appreciated.任何帮助将不胜感激。

The base of the code I'm using was taken from here: https://forum.webflow.com/t/how-to-submit-html-form-directly-to-google-sheets/71432我使用的代码基础取自这里: https://forum.webflow.com/t/how-to-submit-html-form-directly-to-google-sheets/71432

my scriptURL is something like this: https://script.google.com/macros/s/KEY/exec?formUsed=Sheet1我的scriptURL是这样的: https://script.google.com/macros/s/KEY/exec?formUsed=Sheet1

My modified Code.gs code is below:我修改后的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()
  }
}

When you send a GET request to your script, it will set the value of sheetName , and then return that to the user.当您向脚本发送 GET 请求时,它将设置sheetName的值,然后将其返回给用户。 After returning, the script finishes execution and sheetName is no longer defined.返回后,脚本完成执行,不再定义sheetName

Then, when you receive the POST request another , separate instance of the script is executed, so sheetName is undefined.然后,当您收到 POST 请求时,将执行另一个单独的脚本实例,因此sheetName未定义。

The variables only hold their values for the single execution instance.变量仅保存单个执行实例的值。 To retain values across executions, you should save to Properties .要跨执行保留值,您应该保存到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()
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM