Скрипт Google Apps — Цикл обновления нескольких именованных диапазонов на основе справочной таблицы

#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