#javascript #google-apps-script #google-sheets #named-ranges
Вопрос:
Во-первых, я понимаю, что есть способы сделать это без использования именованных диапазонов и сценариев. К сожалению, импортированные диапазоны Google Docs категорически не согласны, поэтому мне нужно найти способ заставить это работать.
Я думаю, что почти справился с этим сценарием, но мне не хватает знаний в области программирования даже для базовых циклов в GAS. Я выделил синим цветом соответствующий раздел электронной таблицы, связанный со сценарием, и поделился примером по этой ссылке:
При редактировании конкретной ячейки я хотел бы, чтобы произошло следующее:
- Возьмите список именованных диапазонов из диапазона ячеек в определенной электронной таблице
- Обновите диапазоны для названных диапазонов из соседнего диапазона ячеек в той же электронной таблице
Я понимаю концепцию использования setNamedRange() по одному, но не в цикле, основанном на диапазонах электронных таблиц. Я хотел бы, чтобы это было расширяемым, чтобы я мог легко расширить количество диапазонов, которые я могу обновить с помощью этого скрипта.
function updateRanges()
{
var ss = SpreadsheetApp.getActive();
//range1
var updateRangeName = ss.getRange("B14").getValue();
var updateRangeValue = ss.getRange("C14").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range2
var updateRangeName = ss.getRange("B15").getValue();
var updateRangeValue = ss.getRange("C15").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range3
var updateRangeName = ss.getRange("B16").getValue();
var updateRangeValue = ss.getRange("C16").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range4
var updateRangeName = ss.getRange("B17").getValue();
var updateRangeValue = ss.getRange("C17").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
//range5
var updateRangeName = ss.getRange("B18").getValue();
var updateRangeValue = ss.getRange("C18").getValue();
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
}
//
function onEdit(e) {
if (e.range.getA1Notation() === 'C2')
updateRanges();
}
Обновление 1
Нашел рабочее решение благодаря Юрию! Вот мой окончательный код. Я также добавил настройку, чтобы триггер onEdit был привязан к определенному листу.
function updateRanges() {
var ss = SpreadsheetApp.getActive();
sheet = ss.getSheetByName("Template")
var ranges = sheet.getRange('B14:C18').getValues();
for (var r in ranges) {
var updateRangeName = ranges[r][0];
var updateRangeValue = ranges[r][1];
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
}
}
function onEdit(e) {
if (e.range.getSheet().getName() != "onEditSheet") {
return
}
if (e.range.getA1Notation() === 'B1') updateRanges();
}
Ответ №1:
Что-то вроде этого?
function updateRanges() {
var ss = SpreadsheetApp.getActiveSheet();
var ranges = ss.getRange('B14:C18').getValues();
for (var r in ranges) {
var updateRangeName = ranges[r][0];
var updateRangeValue = ranges[r][1];
ss.setNamedRange(updateRangeName,ss.getRange(updateRangeValue));
}
}
function onEdit(e) {
if (e.range.getA1Notation() === 'C2') updateRanges();
}
Комментарии:
1. С небольшой настройкой это работает! По-видимому, setNamedRange можно выполнить только на уровне электронной таблицы, а не на уровне листа. Поэтому мне просто пришлось использовать ss = SpreadsheetApp.getActive(); Теперь мне просто нужно выяснить, как задать имена листов для каждого из этих диапазонов — Лист, на котором расположены «диапазоны» — Лист, на котором расположена ячейка триггера onEdit