将脚本从 onEdit(复选框)更改为图像分配
Change a script from onEdit (checkbox) to image assignment
我有以下脚本,现在可以使用复选框 (onEdit)。
当前脚本用法:
- 当您单击位于图表第 9 列和第 2 行的第一个复选框时 Sheet,它会将位于 Charts!B4 的项目添加到关注列表 sheet。
- 当您单击位于图表 Sheet 第 9 列和第 3 行的第二个复选框时,如果该项目已存在于观察列表 sheet。
,它会删除该项目
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()
。可以办到。不过我觉得意义不大。
我有以下脚本,现在可以使用复选框 (onEdit)。
当前脚本用法:
- 当您单击位于图表第 9 列和第 2 行的第一个复选框时 Sheet,它会将位于 Charts!B4 的项目添加到关注列表 sheet。
- 当您单击位于图表 Sheet 第 9 列和第 3 行的第二个复选框时,如果该项目已存在于观察列表 sheet。 ,它会删除该项目
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()
。可以办到。不过我觉得意义不大。