onSelectionChange 在更改选项卡时重新触发自身
onSelectionChange re-triggers itself when changing tab
几天来,我一直在努力让一个简单的功能发挥作用,但我看不出哪里出了问题。如果能提供一些帮助,我将不胜感激。
背景:
我有一个带有 table 的日历选项卡,其侧面包含商店,顶部包含日期。
当用户点击 E7:AI200 我希望能够:
- 从第 1 列和单击的行中获取商店名称,并用该值填充 B1。
- 从第 1 行和单击的列中获取日期,并用值填充 C1。
这似乎工作正常。
我还希望电子表格在单击 E7:AI200 之间的单元格时自动导航到另一个名为 'Filtered Events' 的选项卡。
这似乎也能正常工作。
问题:当我点击回到“日历”选项卡时,它似乎重新点击了原来的单元格并直接导航回 'Filtered Events' 选项卡,我是每次我尝试返回日历时,都会陷入不断切换选项卡的循环。
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 ...
我还没有测试过。如果您提供一些虚拟数据进行测试会更好,您的工作表看起来如何。
几天来,我一直在努力让一个简单的功能发挥作用,但我看不出哪里出了问题。如果能提供一些帮助,我将不胜感激。
背景: 我有一个带有 table 的日历选项卡,其侧面包含商店,顶部包含日期。
当用户点击 E7:AI200 我希望能够:
- 从第 1 列和单击的行中获取商店名称,并用该值填充 B1。
- 从第 1 行和单击的列中获取日期,并用值填充 C1。
这似乎工作正常。
我还希望电子表格在单击 E7:AI200 之间的单元格时自动导航到另一个名为 'Filtered Events' 的选项卡。
这似乎也能正常工作。
问题:当我点击回到“日历”选项卡时,它似乎重新点击了原来的单元格并直接导航回 'Filtered Events' 选项卡,我是每次我尝试返回日历时,都会陷入不断切换选项卡的循环。
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 ...
我还没有测试过。如果您提供一些虚拟数据进行测试会更好,您的工作表看起来如何。