将脚本从 onEdit(复选框)更改为图像分配

Change a script from onEdit (checkbox) to image assignment

我有以下脚本,现在可以使用复选框 (onEdit)。

当前脚本用法:

  1. 当您单击位于图表第 9 列和第 2 行的第一个复选框时 Sheet,它会将位于 Charts!B4 的项目添加到关注列表 sheet。
  2. 当您单击位于图表 Sheet 第 9 列和第 3 行的第二个复选框时,如果该项目已存在于观察列表 sheet。
  3. ,它会删除该项目
function onEdit(e) {
  if (e.range.getSheet().getName() != 'Charts') return;
  if (e.range.columnStart != 9) return;
  if (e.range.rowStart == 2 && e.value == 'TRUE') add_item(e);
  if (e.range.rowStart == 3 && e.value == 'TRUE') remove_item(e);
}

function add_item(e) {
  var [ss, item, favs_sheet, favs_range, favs, header] = get_variables(e);
  if (favs.includes(item)) { ss.toast(item + ' is already in watchlist'); return}
  
  favs.push(item);
  favs = [header, ...favs.sort()].map(x => [x]);
  favs_sheet.getRange(1,2,favs.length,favs[0].length).setValues(favs);
  ss.toast(item + ' was added to watchlist');
}

function remove_item(e) {
  var [ss, item, favs_sheet, favs_range, favs, header] = get_variables(e);
  if (!favs.includes(item)) { ss.toast(item + ' was not found among watchlist'); return }
  
  favs = [header, ...favs.filter(x => x != item).sort()].map(x => [x]);
  favs_range.clearContent();
  favs_sheet.getRange(1,2,favs.length,favs[0].length).setValues(favs);
  ss.toast(item + ' was removed from watchlist');
}

function get_variables(e) {
  e.range.uncheck();
  var ss = e.source;
  var item = e.range.getSheet().getRange('B4').getValue();
  var favs_sheet = ss.getSheetByName('Watchlist');
  var favs_range = favs_sheet.getRange('B:B');
  var favs = favs_range.getValues().flat().filter(String);
  var header = favs.shift();
  return [ss, item, favs_sheet, favs_range, favs, header]
}

我想达到的效果:

我想更改脚本以便使用图像而不是复选框。因此,例如,当您单击 Image1 时,脚本会将项目添加到监视列表 sheet。如果您单击 Image2,脚本将从监视列表中删除该项目 sheet(如果它已经存在)。

谢谢

给你:

function add_item() {
  var [ss, item, favs_sheet, favs_range, favs] = get_variables();
  if (favs.includes(item)) { ss.toast(item + ' is already in Favorites'); return}
  
  favs.push(item);
  favs = favs.sort().map(x => [x]);
  favs_sheet.getRange(2,1,favs.length,favs[0].length).setValues(favs);
  ss.toast(item + ' was added');
}

function remove_item() {
  var [ss, item, favs_sheet, favs_range, favs] = get_variables();
  if (!favs.includes(item)) { ss.toast(item + ' was not found in Favorites'); return }
  
  favs = favs.filter(x => x != item).sort().map(x => [x]);
  favs_range.clear();
  favs_sheet.getRange(2,1,favs.length,favs[0].length).setValues(favs);
  ss.toast(item + ' was removed');
}

function get_variables() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var item = sheet.getRange('E1').getValue();
  var favs_sheet = ss.getSheetByName('Favorites');
  var favs_range = favs_sheet.getRange('A2:A' + favs_sheet.getLastRow());
  var favs = favs_range.getValues().flat();
  return [ss, item, favs_sheet, favs_range, favs];
}

所以你将有两个函数 add_item()remove_item()。您可以将它们中的任何一个分配给图像或绘图。

Here 是我的 sheet.

我将功能分配给文本按钮(绘图),但它可以用与图像相同的方式完成。

我认为代码可以同时用于按钮和 onEdit()。可以办到。不过我觉得意义不大。