【问题标题】:Google Apps Script: Trouble Passing URL Params from doGet() to doPost()Google Apps 脚本:将 URL 参数从 doGet() 传递到 doPost() 时遇到问题
【发布时间】:2019-11-15 06:51:14
【问题描述】:

我无法将变量从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】:

    当您向脚本发送 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()
      }
    }
    

    【讨论】:

    • 谢谢@Diego!我曾尝试在某一时刻设置Property,但我一定做错了。非常感谢您的快速回复!对于后来发现此问题的任何人,您需要在前端触发 GETPOST 以将数据推送到 Google 表格。
    猜你喜欢
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2023-03-31
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多