Google Sheets 脚本函数 UrlFetchApp.fetch 不是从 .onEdit(e) 运行,而是从编辑器运行

2024-07-03

我创建了一个谷歌表格,其中包含沙滩排球杯的大量信息,我想在该表格中选中复选框时调用我创建的 API。

function onEdit(e){
  const ui = SpreadsheetApp.getUi();
  const spreadsheets = SpreadsheetApp.getActive();
  const configSheet = spreadsheets.getSheetByName("Config")
  var tourneyId = String(configSheet.getRange(2,4).getValue())
  var tourneyTitle = String(configSheet.getRange(2,5).getValue())
  var sheet = spreadsheets.getActiveSheet()
  if (sheet.getName() == "LiveScore"){
    var actRng = sheet.getActiveRange();
    var editColumn = actRng.getColumn();
    var rowIndex = actRng.getRowIndex();
    actRng = actRng.getCell(1, 1);
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
    if(editColumn == 7 && rowIndex != 1){
      onStartBroadcastClicked(actRng, ui, sheet, rowIndex, editColumn, tourneyTitle);
    }
  }
}

在我看来,这部分从来没有任何问题。但是当我进入 onStartBroadcastClicked 函数时:

function onStartBroadcastClicked(actRng, ui, sheet, rowIndex, editColumn, tourneyTitle){
  var homeTeam = String(sheet.getRange(rowIndex, 14).getValue());
... // more setting variables
  var endTime = new Date(startTime.getTime() + MILLIS_PER_MATCH);

  if(actRng.isChecked()){
    var response = ui.alert("You are about to start a new broadcast. Are you sure?" +
                            "\n Title: " + title, ui.ButtonSet.YES_NO);
    if (response == ui.Button.YES) {
      var httpRequest = "https://someUrl";
      var options =
          {
            'method':'POST',
            'contentType': 'application/json',
            'payload' : JSON.stringify({
              "title" : title,
                  ... // setting all variables
              "description" : description
            }),
            'muteHttpExceptions' : true,
            'headers' : {
              "Authorization": "Basic " + Utilities.base64Encode(USERNAME + ":" + PASSWORD)
            }
          };

      ui.alert("Waiting.......")
      var result = UrlFetchApp.fetch(httpRequest, options);
      ui.alert(result.getContentText())

问题是它总是会到达终点线ui.alert("Waiting......."),但是当从复选框触发时,它永远不会成功http POST 请求。如果我在编辑器中单击“播放”,它就会成功,并且我在警报框中收到了响应。

可能是超时或自动保存问题?有谁知道该去哪里继续寻找吗?我已经被困在这里有一段时间了,如果有人能指出我正确的方向,我会非常高兴。


您的问题的修改点是使用 OnEdit 事件的可安装触发器。当简单触发器使用需要授权的方法时,就会出现错误。这种情况让我们觉得这个脚本似乎行不通。

为了避免此错误,请使用OnEdit事件触发器的可安装触发器。

重要的是,在安装触发器之前,请重命名以下函数名称onEdit()改为其他名称。并将重命名的函数名称安装为 OnEdit 事件触发器。这样,重复运行onEdit()是可以预防的。如果onEdit()函数作为可安装的触发器安装,当编辑单元格时,该函数将运行 2 次。Ref https://gist.github.com/tanaikech/88f7fd5ed14da5e9afde18310da61cb5.

通过上述设置,当编辑单元格时,UrlFetchApp.fetch() works.

参考:

  • 简单的触发器 https://developers.google.com/apps-script/guides/triggers/
  • 可安装的触发器 https://developers.google.com/apps-script/guides/triggers/installable
  • 使用事件触发器的异步处理 https://gist.github.com/tanaikech/88f7fd5ed14da5e9afde18310da61cb5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Sheets 脚本函数 UrlFetchApp.fetch 不是从 .onEdit(e) 运行,而是从编辑器运行 的相关文章

  • 如何禁用 Mapbox 中的事件侦听器?

    我正在尝试使用 React 上的 Mapbox 来控制图层上的事件侦听器 map off 应该可以做到这一点 但它并没有删除图层中的 onclick 事件 https docs mapbox com mapbox gl js api map
  • 在javascript中解压缩字符串[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人知道一个实现 UNZIP 算法的简单 JavaScript 库吗 没有磁盘文件访问 仅压缩和解压缩
  • 使用 Cookie 记住我时的安全性

    我已经在 PHP 中实现了一个登录类 并且想要创建一个记住账号键入功能 这样用户就不必每次访问都登录 我对此进行了一些研究 并准备使用 PHP setcookie 编写它 但后来遇到了这个页面 如何使用 jquery 创建 记住我 并存储
  • style.backgroundColor 在 JavaScript 中是一个空字符串

    我下面有以下代码 我正在尝试设置背景颜色 但是 背景颜色返回为空字符串 我不知道为什么 它与 javascript 类型有关吗 function function1 var color document getElementById rg
  • 如何禁用已经预订的日期?

    我有一个预订酒店房间的表格 其中有两个字段 称为入住和退房 我在这里使用 jQuery datepicker 预订房间 我不想显示那些已经预订的日期 我已经尝试过这样的 function var excludedCheckInDates C
  • 将命名函数存储在具有不同名称的变量中

    考虑这段代码 var x function z console log called x x will print out called x z ReferenceError 因此 可以在变量中存储命名函数 但我们仍然只能通过变量名来调用该
  • 有没有办法为非 60hz 的高/低帧速率显示器设置 rAF 的 FPS?

    所以我有一台 120hz 显示器和一台 60hz 显示器 如果我在第一个显示器上运行游戏 它会运行得非常快 但是当我在第二个显示器上运行它时 它会变慢 我知道也有很多 30hz 显示器 但速度会更慢 还有一些 240hz 显示器 速度快如闪
  • 如何处理对象字面量?

    我是 Javascript 新手 试图提取存储在对象中的一些文本 该对象被定义为对象字面量并传递给 a 中的函数调用该函数 脚本 和对象 具有以下结构 foo query count 2 created 2009 07 25T08 17 5
  • 如果未选中所有复选框,则禁用按钮;如果选中至少一个复选框,则启用该按钮

    我有一个表格 每行都有一个复选框 下面有一个按钮 如果至少选中一个复选框 我想禁用该按钮 tbody tr td td tr tbody
  • Cckeditor 字符限制与 charcount 插件

    我怎么能够prevent用户输入新字符在最大字符之后已达到限制 Ckeditor charcount 插件只是向我显示剩余的字符 我希望它停在 0 处 但它会减去整数 这是我的 html 代码
  • Angular ui - 选项卡控制器执行多次

    当我单击一个选项卡时 相应的控制器会执行 4 次 为什么 E g DetailsPersonController s init函数执行了4次 仅应在加载选项卡视图后执行 HTML 标签
  • 使用 GruntJs 缩小脚本

    我有几个 js 文件 我似乎可以让 GruntJs 正确地连接 缩小它们 如果我单独做每一个 它们就会工作得很好 如果我单独组合然后尝试缩小组合文件 它也不起作用 Here is the error 有想法该怎么解决这个吗 或者也许是什么原
  • 如何使用 Google App Script 在 Google Drive 中创建大文件?

    我正在尝试使用 Google Apps 脚本在 Google Drive 中创建一个大文件 该文件合并了三个文件 我的代码是 function unirFicheros idDirectorio nombreFichero numeroFi
  • 如何在新窗口中获取dom元素?

    JavaScript 中的一个简单任务是打开一个新窗口并在其中写入 但我需要在一个dom元素中写入一个带有ID的div var novoForm window open somform html wFormx width 800 heigh
  • 使用 SVG 的部分边框/描边

    我正在使用 svg d3 创建由 矩形 元素组成的图表 为每个矩形添加部分边框 描边 仅在矩形顶部 的最佳方法是什么 Thanks 我不认为 SVG 支持仅描边矩形或路径的一部分 描边不像 CSS 边框 您还有其他一些选择 所有这些都需要一
  • 删除CKEditor图像插件中的htmlPreview

    我在 CKEditor 的图像插件中隐藏预览元素时遇到问题 我需要一个非常简单的图像对话框 其中只有图像源的输入字段和带有图像上传按钮的表单 因此 我使用这些自定义配置设置删除了不必要的元素 CKEDITOR on dialogDefini
  • 使用相同的 URL 哈希刷新 BackboneJS? [复制]

    这个问题在这里已经有答案了 我当前的主干应用程序有一个 url localhost users 有没有办法访问localhost users当位于 URL 时localhost users所以它会刷新页面 目前 当我在localhost u
  • WEBP图像回退

    我在互联网上搜索了很多 找不到可以完整教授的正确示例或完整教程 所以请大家给我推荐一些好的例子 我已经在很多网站上尝试过 WEBP 代码 例如与现代化工具一起使用 检查浏览器支持或使用背景图像 有一篇关于 Stucox 的文章 您可以在其中
  • Phantomjs 可以工作,但速度很慢

    我正在尝试使用 PhantomJS 截取网页的屏幕截图 具体来说 我正在使用捕获的示例espn com from this http skookum com blog dynamic screenshots on the server wi
  • JavaScript 开发人员不使用 Array.push() 是否有原因?

    我经常看到开发人员在 JavaScript 中使用如下所示的表达式 arr arr arr length Something arr arr length Another thing 不会push更合适吗 arr arr push Some

随机推荐