【问题标题】:OnSelectionChange Not Working Consistently with SpreadsheetApp.getUI().alert("Message") - Google Apps ScriptOnSelectionChange 与 SpreadsheetApp.getUI().alert("Message") 不一致 - Google Apps 脚本
【发布时间】:2021-10-20 21:13:15
【问题描述】:

这是最奇怪的事情。我有一个简单的触发器 OnSelectionChange 函数,它根据单击的指定单元格发出警报并运行不同的函数。它正在工作。现在它不工作了。有时如果我关闭程序,发誓,然后再次打开它,它会工作,有时不会。它在 90% 的情况下都无法正常工作。

在下面的示例中,如果您在工作表 Units 上并单击标题为 SaveUpdateA1 的单元格区域,它应该会发出警报“为什么这不起作用?”。没发生什么事。执行视图显示“暂停”,然后最终显示“超时”。

示例

function onSelectionChange(e) {
  var app = SpreadsheetApp; 
  var activeSheet = app.getActiveSpreadsheet(); //Get current active spreadsheet
  var sheet = e.source.getActiveSheet().getName(); //Gets name of sheet where cell was clicked

  //row and column index of active (clicked) cell: 
  var range = e.range; //Activates range of clicked cell
  var rangeA1 = range.getA1Notation(); //Gets A1 notation of clicked cell
  var row = range.getRow(); //Gets row # of clicked cell
  var col = range.getColumn(); // Gets col # of clicked cell
  
  // UNIT SHEET TRIGGERS:
  if(sheet == "Units"){
    var sheetUnits = activeSheet.getSheetByName('Units');
  
    //Variables for Buttons to Save/Update, Add New, Vacate/Archive, and Cancel
    var SaveUpdateA1 = sheetUnits.getRange('O8:O9').getA1Notation(); //A1 notation of Save/Update button
    //Other buttons omitted for this example

    //SAVE/UPDATE BUTTON
    if(rangeA1 == SaveUpdateA1){  
      SpreadsheetApp.getUi().alert("Why aren't you working?");
    } 

如果我用以下代码替换上面代码中的最后一个函数,它可以工作,尽管速度很慢:

    if(rangeA1 == SaveUpdateA1){  
      sheetUnits.getRange('P2').setValue("Wow");
    } 

我看到一个帖子说它需要是一个可安装的触发器才能使用.getUi().alert(),但后来他们说onSelectionChange 不是一个允许的可安装触发器。 (我需要onSelectionChange,因为我在模拟点击按钮)。

另一个人说.getUi().alert() 应该在onSelectionChange 中工作,但显然不是我的情况。

如果存在.getUi().alert() 的替代方案并且与onSelectionChange 一致工作,我会非常满意。

有谁知道如何解决这个问题或使用替代功能?非常感谢!

【问题讨论】:

  • 我认为您可能会遇到限制developers.google.com/apps-script/guides/triggers 要么您正在尝试做一件被禁止的事情,要么您正在做的事情太多以至于您遇到了触发限制。为什么你实际上不使用按钮? (您“插入绘图”,然后使用汉堡菜单将脚本附加到它)。此外,您尝试做的事情的更多背景会有所帮助。
  • 运行上面只需要2.7S,所以我认为我没有进入30秒的时间限制。我尝试用 toast 功能替换警报功能,但它仍然不起作用,而 toast 在我的 onedit 触发器中工作得非常好。所以肯定和onSelectionChange有关。我不想在绘图中使用按钮,因为目的是保存/更新数据库。如果您编辑一个单元格并且不按“Enter”然后单击按钮绘图,它将不会更新。都非常令人沮丧。

标签: google-apps-script google-sheets triggers


【解决方案1】:

根据我的经验,onSelectionChange() 简单触发器的工作始终非常不可靠。 documentation 告诉我们:

要激活此触发器,您必须在添加触发器后以及每次打开电子表格时刷新电子表格。 [...] 如果选择在短时间内在多个单元格之间移动,则可能会跳过一些选择更改事件以减少延迟。

如果您希望 Google 解决此问题,请在跟踪器中为 issue 178615259 加注星标。

您的用例中的一种解决方法是使用onEdit(e) 简单触发器,让您将复选框用作脚本运行器按钮。示例代码参见checkboxButtons_ 脚本。

【讨论】:

  • 触发器根据执行日志工作。在我的“哇”示例中,它运行良好,并且在 2.8 秒内。正如我在上面的另一条评论中提到的,即使吐司也不起作用。所以似乎任何类型的警报都有问题?你知道是否可以将 onSelectionChange 做成可安装的触发器吗?不知道手机能不能用?我更喜欢这个而不是复选框,因为它更干净,更容易让用户理解。谢谢
  • onSelectionChange(e) 简单触发器可以执行与onEdit(e) 简单触发器相同的操作。你提到的Spreadsheet.toast() 的问题很可能是因为你的代码永远不会运行。使用console.log() 验证您的代码是否运行。使用onEdit(e) 使其更可靠。
  • 感谢您的提示。我尝试了 console.log() 并且代码正在运行。我也在 console.log() 之后添加了一条 toast 消息。我今天第一次加载它,它工作。随后的每一次,console.log() 消息都会继续工作,但 toast 停止工作。当我输入 get.Ui().alert() 消息时,程序超时。有史以来最奇怪的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多