【问题标题】:onSelectionChange re-triggers itself when changing tabonSelectionChange 在更改选项卡时重新触发自身
【发布时间】:2021-12-17 09:11:33
【问题描述】:

几天来,我一直试图让一个简单的功能正常工作,但我看不出哪里出错了。非常感谢您能提供一些帮助。

背景: 我有一个日历选项卡,其中有一个表格,其中包含侧面的商店和顶部的日期。

当用户在 E7:AI200 之间点击时,我希望能够:

  • 从第 1 列和单击的行中获取商店名称,然后用值填充 B1。
  • 从第 1 行和单击的列中获取日期,并用值填充 C1。

这似乎工作正常。

我还希望电子表格在单击 E7:AI200 之间的单元格时自动导航到另一个名为“过滤的事件”的选项卡。

这似乎也可以正常工作。

问题:当我单击返回“日历”选项卡时,它似乎重新单击了原始单元格并将我直接导航回“过滤的事件”选项卡,我陷入了不断循环每次我尝试返回日历时都会在选项卡之间切换。

function onSelectionChange(e) {

  var ss = SpreadsheetApp.getActive();
  if (ss.getActiveSheet().getName() == "Calendar") {
    var sheet = ss.getSheetByName("Calendar");
    
    var full_range = sheet.getRange("A1:AI200");
    var click_range = e.range;

    var row_lookup = click_range.getRow();
    var col_lookup = click_range.getColumn();

    var selected_store = full_range.getCell(row_lookup, 1).getValue();
    var selected_date = full_range.getCell(1, col_lookup).getValue();

    var populate_store = sheet.getRange("B1"); 
    var populate_date = sheet.getRange("C1");

    if (row_lookup > 6 && row_lookup < 250 && col_lookup < 36 && col_lookup > 4) { 

      populate_store.setValue(selected_store);
      populate_date.setValue(selected_date);

      var change_sheet = ss.getSheetByName("Filtered Events");
      change_sheet.activate();
    } 

    else {
      populate_store.setValue('');
      populate_date.setValue('');
    } 
  }
} 

【问题讨论】:

  • 也许,作为一种变通方法,您可以在“日历”表上选择一些“安全”单元格(例如 A1),并在其中一次单击后激活该单元格。在脚本开始时,您可以检查活动单元格是否为“A1”并且在这种情况下不执行任何操作。
  • 另一种方法:您可以使用PropertiesService.getScriptProperties().setProperty() 保存最后单击的单元格的坐标,并在脚本开头使用PropertiesService.getScriptProperties().getProperty() 进行检查。如果坐标相同,则什么也不做。示例在这里:stackoverflow.com/a/70374018/14265469
  • 谢谢你——你能帮忙看看我的脚本中的样子吗?我很难知道如何实现它
  • 我刚刚添加了如何使用PropertiesService 的示例。
  • 为什么不直接使用复选框和 onEdit 触发器?

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


【解决方案1】:

也许您可以使用PropertiesService 存储所选单元格的最后使用坐标并在脚本开始时检查它们:

function onSelectionChange(e) {

  var ss = SpreadsheetApp.getActive();
  if (ss.getActiveSheet().getName() == "Calendar") {
    var sheet = ss.getSheetByName("Calendar");
    
    var full_range = sheet.getRange("A1:AI200");
    var click_range = e.range;

    var row_lookup = click_range.getRow();
    var col_lookup = click_range.getColumn();

    // try to get the last used cell coordinates
    var last_cell_row = PropertiesService.getScriptProperties().getProperty('last_cell_row');
    var last_cell_col = PropertiesService.getScriptProperties().getProperty('last_cell_col');

    // save current cell coordinates
    PropertiesService.getScriptProperties().setProperty('last_cell_row', row_lookup);
    PropertiesService.getScriptProperties().setProperty('last_cell_col', col_lookup);

    // if the coordinates are the same break the function
    if (row_lookup == last_cell_row && col_lookup == last_cell_col) return;

    // the rest of your code ...

我没有测试过。如果您提供一些用于测试的虚拟数据会更好,您的工作表是什么样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    相关资源
    最近更新 更多