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) 运行,而是从编辑器运行 的相关文章

  • 为什么异步 XMLHttpRequest 优于同步请求? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Titanium 中向 TableView 部分追加一行?

    我正在使用 Titanium 开发 iPhone 应用程序 并且需要将一行附加到特定的表格视图部分 https developer appcelerator com apidoc mobile 1 0 Titanium UI TableVi
  • Jquery 密码字段的默认值

    我在用这个 Jquery 插件 http mudge github com jquery example 用于使用单击时消失的文本填充输入 它对于密码字段来说并不理想 因为所有内容都显示为点 在开始输入之前使默认文本在密码字段中可见的好方法
  • 在 C# 中使用匿名类型创建对象文字时出现问题

    我正在尝试构建 JavaScript 对象文字的 C 近似值 以传递给 asp net MVC 中的视图模型 var obj new dynamic new name Id index Id width 40 align left new
  • CdnFallbackExpression 列表

    CDN 上有很多可用的开源 JS 库 使用 ASP NET MVC 的捆绑功能 可以定义 CDN 失败时的后备方案 CdnFallbackExpression 是一个有用的功能 但是 我似乎找不到用于 jquery 之外的库的任何表达式列表
  • 用随机图像填充表格

    首先 我的编码经验包括修改简单的脚本以在我的页面上工作 其次 我搜索并发现了几个类似的问题 但无法完全解决它们 我需要一些帮助来使用大约 40 张图像数组中的随机图像填充 3x3 表 我目前有一个使用 backgroundImage 属性的
  • php curl 获取 html 和 js 渲染

    php curl 只获取html页面的源代码 不执行js脚本 我需要我的网站获取已执行所有 JavaScript 的源代码 我使用ajax 但无法在页面中添加更多js 因为当我加载另一个页面时脚本会保留 我找到了 SpiderMonkey
  • 使用 javascript 分割图像

    如何使用 javascript 获取单个图像的一部分并将其存储在数组中 然后在 html5 画布上随机显示 您可以使用drawImage 方法的剪切参数并将剪切的图像绘制到动态创建的画布上 一个例子可以是 function getClipp
  • 我应该担心 JavaScript 支持吗?

    我开发了一个支持ajax 的网站 然而 该网站目前无法在没有 JavaScript 的情况下运行 该网站在我测试过的任何浏览器以及 iPhone 诺基亚手机上都运行良好 但是 我还应该担心 javascript 支持吗 我知道有一些技术可以
  • 如何在新窗口中获取dom元素?

    JavaScript 中的一个简单任务是打开一个新窗口并在其中写入 但我需要在一个dom元素中写入一个带有ID的div var novoForm window open somform html wFormx width 800 heigh
  • 如何安装并开始使用 Vuetify 和 Vue.js 3

    我在哪里可以找到新的 Vuetify 版本与 Vue js 3 兼容的文档以及如何使用 Vue cli 安装和设置它 在 vue 2 中我们这样做 vue create project name then vue add vuetify 我
  • 为什么需要@babel-core

    我是 Babel 和 JS 的新手 我想知道何时以及为何使用 babel core 包而不是 babel cli From 巴贝尔官方文档 https babeljs io docs en Babel是一个工具链 主要用于转换ECMAScr
  • Webpack - devtool:CSS 的源映射和 JS 的 eval-source-map?

    如果我使用 devtool source map 它与 CSS 配合得很好 但是 我的 JavaScript 变量名并不有趣 所以 如果我使用 devtool eval source maps 生活很美好 调试 JS 但我的 CSS 然后指
  • 有没有可靠的方法在 IE11 中使用 ctx.drawImage() ?

    我有一个脚本 可以根据数据查询创建动态 SVG 图形 我需要将它们粘贴到 PDF 中 为此我使用 jsPDF 不幸的是 jsPDF 自己的 addSVG 似乎不起作用 所以我花了一些时间尝试使用画布将 SVG 转换为 PNG 我似乎可以将
  • 检查纬度和经度是否在谷歌地图圆内

    以下是我正在寻找的期望结果 我想知道的是 我使用中心点纬度和周围半径创建了圆 现在我想知道 如何检查 计算 纬度和经度是否在该区域之内或之外 如果您能给我 JavaScript 代码示例 我将不胜感激 我正在使用 Google 地图 API
  • 处理 jQuery 中的所有事件类型

    在使用 jQuery 的应用程序中 我希望每次触发任何类型的事件 包括自定义事件 时都记录到控制台 无论如何 是否可以在不修改 jQuery 源代码并且不绑定到每个可能的事件类型的长列表的情况下执行此操作 var oldTrigger jQ
  • Chart.js 忽略画布高度和宽度

    继Chart js 文档 http www chartjs org docs getting started creating a chart我正在尝试绘制一个小图表
  • 使用加载器 ts-node/esm.js 运行节点需要导入具有 .js 扩展名

    我正在尝试将我的 package json 设置为模块来运行节点 14 type module 如果我在打字稿文件上运行此命令 node loader ts node esm mjs experimental top level await
  • 如何构建我的 PHP 项目?

    我即将开始另一个大型 PHP 项目 这次 我打算让项目文件夹变得整洁 所以我有几个关于保持我的项目干净和干燥的问题 如何区分 PHP 源文件和浏览器应访问的 PHP 文件 换句话说 我如何清楚哪些 PHP 文件提供输出 哪些提供函数或类定义
  • 街景中标记上的 InfoWindows

    根据 Google 文档 当您在地图上创建标记时 市场也会 复制 到地图的街景版本上 但是 onClick 事件绑定不会被复制 或者至少看起来不会被复制 因此我无法在 StreetView 中打开标记上的 InfoWindow 理想情况下

随机推荐