Скрипты листов Google - получение фактического диапазона для копирования / вставки - PullRequest
0 голосов
/ 01 сентября 2018

Я пишу небольшой скрипт, чтобы помочь мне с проверкой данных, и я столкнулся с проблемой:

Учитывая диапазон из 10 строк и 1 столбца, я выбираю как минимум 2 из этих строк и копирую их, а затем вставляю в другое место на листе, и получаю что-то подобное в качестве обратной связи через Logger.log:

[18-08-31 14:15:32:677 PDT] coverage rows[1.0-3.0] cols[5.0-5.0]

Отпечатано:

curRange = e.range;
var minRow = curRange.getRow();
var maxRow = curRange.getLastRow();
var minCol = curRange.getColumn();
var maxCol = curRange.getLastColumn();
Logger.log("rows[%s-%s] cols[%s-%s]", minRow, maxRow, minCol, maxCol);

Теперь ... странная часть: если у меня есть фильтр в указанном столбце, и я выбираю для отображения только 1 значение, я получу, скажем, 4 строки (идентификаторы 2, 5, 6 и 8). Если я выполню копию этого меньшего диапазона (4 строки и 1 столбец), а затем вставлю его где-нибудь еще на листе, я получу следующий отзыв:

[18-08-31 14:15:32:677 PDT] coverage rows[2.0-2.0] cols[5.0-5.0]

Есть ли какой-нибудь способ через onEdit (e) {e.range} выяснить, какие ID я редактировал? Или любое другое решение, которое принесло бы мне значения 2, 5, 6 и 8?

1 Ответ

0 голосов
/ 01 сентября 2018

Я хотел бы просто использовать это в комментарии, но это слишком запутано там. Поэтому я напишу ответ вместо этого.

onEdit(e) срабатывает только при редактировании диапазона, а e - это редактируемый диапазон. Так что, если вы вставите данные, вы будете вызывать onEdit(e), где e - ваш пункт назначения, а диапазон источника навсегда «забыт». Используя onEdit(e), невозможно узнать, что вы сделали, прежде чем запускать его. Следовательно, вы не можете ничего записать в свой журнал до того, как onEdit(e) запустил .. в этом случае диапазон, в который вы скопировали данные.

Вот небольшой трюк, чтобы сделать то, что вам нужно: копировать и вставлять, используя скрипт. Напишите функцию с чем-то вроде этого

for(i = r;i < r + numRow ;i++) {
    if (sheet.getRange("A" + i) matches filter) {// assume that you filter your data based on column A
    copy data to destination
    write source to log
    } 
 }

и затем назначьте эту функцию где-нибудь на вашем листе.

Каждый раз, когда вам нужно выполнить свою работу, вам нужно только запустить свою функцию.

Хотя есть и другой способ добиться того, чего вы хотите, это записать номер строки в одном столбце с помощью =ARRAYFORMULA(ROW(A1:A1000)), а когда вы копируете данные, тоже скопируйте этот столбец, тогда вы можете обработать это значение как будто вы работаете с номером строки в вашем коде. Ну, это неаккуратно, и вам, возможно, придется время от времени редактировать формулу, когда ваш лист расширяется более чем на 1000 строк ... вот почему я не рекомендую его. Но если вы можете предсказать, сколько строк хорошо для вашего листа, я думаю, что все в порядке ..

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