Как получить фактическую позицию диапазона, когда были добавлены новые строки выше - PullRequest
0 голосов
/ 12 октября 2018

рассмотрите эту ситуацию.

  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("2:2");
  var values = range.getValues();
  values[0][0] = "updated value"; //updating retrieved data
  sheet.insertRowAfter(1); //here the problem appears
  range.setValues(values); //trying to save updated row data - FAIL!

Обновленные значения строк будут записаны в строке № 2 (в соответствии с селектором диапазона «2: 2»), а не в новой позиции «3: 3».Результат: он перезапишет данные в строке 2 вместо обновления ранее выбранной / загруженной строки, которая теперь находится в позиции «3: 3», а не в позиции «2: 2».

Я ищу способ каксохранить «адрес» диапазона, даже когда диапазон был смещен из-за добавления / удаления строк / ячеек где-то еще на листе.

В этом фиктивном примере я могу отслеживать изменения диапазона.Но при параллельной обработке / обновлении листа я не могу просто отслеживать все изменения из разных мест.

До сих пор я придумал решение добавить новые строки только в конце SS (это не меняет диапазоналюбых строк выше, но я хотел бы иметь возможность добавлять новые строки поверх листа, не влияя на уже выбранные диапазоны. Удаление строк также опасная ситуация - это также меняет положение диапазонов.

LockService не может реальноРешите ситуацию, потому что у меня есть много сценариев, работающих на одном листе (не использую централизованную библиотеку из-за высокой производительности в аддоне).

Метаданные для ячейки или строки кажутся слишком сложными для такой простой задачи.

С моей точки зрения, Range объекта должен сохранять свою позицию, даже когда он перемещается / перемещается куда-то еще, в противном случае я не вижу причины иметь Range в качестве объекта - если он сохраняет только фиксированную информацию о том, откуда онвыбрал. Любые советы приветствуются. Заранее спасибо ..

РЕДАКТИРОВАТЬ:

Просто чтобы добавить контекст.Я использую листы Google в качестве базы данных для заказов (пока 10 тысяч) - каждая строка означает один заказ (клиент), и не все заказы находятся на одном листе - разные продукты имеют разные листы (+ - 10 продуктов / листов)

Существует предложение использовать именованные диапазоны для решения этой проблемы - так что же произойдет, если электронная таблица будет иметь десять тысяч именованных диапазонов - может ли это работать без серьезных проблем с производительностью?Я подумываю о создании именованного диапазона для каждой строки заказа, чтобы я мог легко подобрать правую строку по OrderId и не бояться перемещения строки, когда новый заказ поступает во время обработки другого

1 Ответ

0 голосов
/ 24 июля 2019
  • Вы хотите добиться следующего потока.
    1. Извлечение значения из "2:2" (строка 2).
    2. Изменение полученного значения.
    3. Вставка строки чуть ниже строки 1.
      • Таким образом, начальная строка 2 перемещается в строку 3.
    4. Поместите полученное значение в строку 3, которая является начальной строкой 2.
  • Вы хотите добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этого ответа?Пожалуйста, подумайте об этом как об одном из нескольких ответов.

Проблема и решение:

  • В вашем сценарии range из var range = sheet.getRange("2:2"); является константой.При этом, даже когда строка вставлена, это значение не изменяется.Это причина вашей проблемы.

  • Я думаю, что идея использования именованного диапазона будет решена для вашей ситуации.Но ваш комментарий гласит следующее.

    • I just found, that namedRange is not capable actualize its own address, if something had changed in the sheet after initialize of a range.
  • Когда строка 2 установлена ​​в качестве именованного диапазонакогда строка вставляется чуть ниже строки 1, диапазон именованного диапазона также изменяется.Но из вашего комментария я подумал, что указанный диапазон, возможно, не был перезагружен.

Чтобы подтвердить это, я хотел бы предложить пример сценария.

Пример сценария:

Перед запуском сценария установите именованный диапазон в строку 2 в качестве имени sampleNamedRange.Затем запустите этот скрипт.

var ss = SpreadsheetApp.getActiveSpreadsheet(); // Added
var sheet = ss.getActiveSheet(); // Modified

// Retrieve the range from the namedRange.
// namedRange of "sampleNamedRange" is installed for the range of "2:2" of the active sheet.
var range = ss.getRangeByName("sampleNamedRange"); // Modified
var values = range.getValues();
values[0][0] = "updated value"; //updating retrieved data
sheet.insertRowAfter(1);

// Retrieve the range from the updated namedRange.
var range = ss.getRangeByName("sampleNamedRange"); // Added
range.setValues(values);

Результат:

enter image description here

Примечание:

  • Суть в том, чтобы извлечь диапазон из обновленного именованного диапазона.Таким образом, обновленный диапазон может быть использован.Таким образом, в приведенном выше сценарии обновленное значение помещается в строку 3.

Ссылки:

Если я неправильно понял ваш вопрос, и это был не тот результат, который вы хотите, я прошу прощения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...