google-apps-script - onSelectionChange 在更改选项卡时重新触发自身

标签 google-apps-script google-sheets triggers

几天来我一直在尝试让一个简单的函数正常工作,但我不知道哪里出了问题。如果您能提供一些帮助,我将不胜感激。

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

当用户在 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('');
    } 
  }
} 

最佳答案

也许你可以使用 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 ...

我没有测试过。如果您提供一些用于测试的虚拟数据(您的工作表的外观),那就更好了。

关于google-apps-script - onSelectionChange 在更改选项卡时重新触发自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70390785/

相关文章:

mysql - 从应用程序脚本到本地 MySQL 的 JDBC 连接

javascript - 在 getRangeList 中传递参数时找不到范围

java - 如何使用 Google Apps 脚本执行 API + Java 创建 Google 表单?

google-apps-script - 谷歌驱动器重复文件

正则表达式-替代匹配是另一个匹配的子字符串

sql - SQL 存储过程中的 "referencing old"和 "referencing new"有什么区别?

sql - 通过表触发器捕获存储过程参数

google-apps-script - 您如何使用 google Mailapp 回复电子邮件线程?

google-apps-script - 如何在 Google 电子表格中以编程方式(在 Google 应用程序脚本中)为数据验证设置命名范围?

mysql - SQL命令返回用户大于阈值