【问题标题】:Additional Google sheet row manipulation after ading data with doPost使用 doPost 添加数据后的其他 Google 工作表行操作
【发布时间】:2019-07-06 21:01:18
【问题描述】:

我正在使用 fetch/doPost 从一个简单的 html 表单在 Google 工作表中添加一行,并且喜欢通过脚本函数处理新行。

代码来自 GitHub (jamiewilson/form-to-google-sheets)

html part:
fetch(scriptURL, {method: 'POST', body: new FormData(form)})
.then(response => showSuc())
.catch(error => alert('Error! ' + error.message))

GScript part:
function doPost (e) {
  var lock = LockService.getScriptLock()
  lock.tryLock(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])
    // Browser.msgBox("posted");
    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()
  }
// Browser.msgBox("posted");
}

因为以这种方式添加数据不会触发 onEdit 或 onChange,所以我想弄清楚在 doPost 中的何处放置对处理新行的函数的调用。 Browser.msgBox(在上面的示例中注释)都没有显示任何输出,也没有显示对我的函数的调用。 知道如何解决这个问题吗?

【问题讨论】:

  • 你已经尝试了什么?
  • 是什么让你认为你放置的函数没有运行。显示日志。
  • 当我从工作表中的菜单启动该功能时(基于 onEdit 触发器,将最后一行复制到另一个工作表,具体取决于 C 列的内容)。放置在 doPost 中的相同函数调用什么也不做。
  • 我添加了这段代码: ... sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);分发最后('C'); Logger.Log("distributeLast('C')"); return ContentService ... 这是执行 html 部分后的结果(新行添加到工作表中,因此执行了 doPost):未找到日志。使用 Logger API 将日志添加到您的项目。
  • @S.Hristov 您能否更新问题中的代码以包含新代码?

标签: google-apps-script google-sheets


【解决方案1】:

@St3ph 感谢您的帮助! 现在揭示了这个谜团:-) 在 html 部分,我有一个菜单可以选择数据发送到的 google 表。此菜单中的所有 3 张桌子都是相同的,每张桌子都有自己独特的https://script.google.com/macros/s/table__key/exec。由于某种原因,doPost 是从表 2 中执行的,按时间顺序是在表 1 之后的几天和表 3 之前的几天创建的。我在表 1 中包含的所有“后处理”功能(其中它们的相关数据)并且它们可以从表中的菜单执行正常工作。我已经完全评论了表 1 和表 3 的 doPost 并且所有 3 个表都像以前一样继续接收数据。 在发布所有 3 个应用程序(对于我的 3 个表)时,我使用了我的凭据并根据 GitHub - jamiewilson/form-to-google-sheets 选择以匿名方式运行。 显然有一些重复导致了奇怪的行为。

【讨论】:

    【解决方案2】:

    您的网络应用程序是如何发布的?当您发布您的网络应用程序时,您可以选择使用您的凭据或用户凭据运行 然后选择是否匿名运行。

    您想要做的简单方法是使用您的凭据和匿名用户运行应用程序。但是如果你在 JS 中从一个网页中获取它是行不通的。您必须使用 JSONP 来避免“跨域问题”。

    其他解决方案是使用来自 Javascript 的 Apps Script API。

    将发布数据发送到已发布以匿名运行的脚本只能通过服务器端脚本完成。对于 JS 是上面的 2 种解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2020-06-14
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      相关资源
      最近更新 更多