Варианты копирования формул
Существует 4 основных способа копирования формул при помощи Google Apps Script:- Комбинирование методов
getFormulas()/setFormulas() - Использование универсального метода
copyTo() - Комбинирование методов
getFormulaR1C1()/setFormulaR1C1() - Опосредованное применение комбинирования методов
getFormulas()/setValues()
Примеры
Положим, что существует ситуация, в которой необходимо программно скопировать формулы в Таблице Гугл. Например,F3 необходимо сопировать формулу в
F4. В данном месте стоит обговорить некоторые детали. Первый, третий и четвертый способы очень похожи. Опосредованность четвертого заключается
в том, что при вставке данных Таблица автоматически определяет контент как формулу и превращает ее в таковую. Этот способ
полезен тогда, когда необходимо заполнить Таблицу массивом данных, и для ускорения процесса возможно использовать опосредованность,
чтобы избежать дополнительных вызовов при вставке.
Т.к. способы 1 и 2 заведомо могут вернуть разные результаты, в пример добавлена колонка
G3, и для сравения она будет копироваться в ячейку
G4.
Основная композиция комбинированного способа
// Комбинированный способ 1
function combinedMethod(sheet){
var from = sheet.getRange("F3");
var to = sheet.getRange("F4");
to.setFormula(from.getFormula());
}
Важно обратить внимание на следующий факт. Если использовать вместо первого способа третий, то получим совершенно иной результат, а именно корректное копирование формулы с относительным смещением диапазона
// Комбинированный способ 2
function combinedMethod(sheet){
var from = sheet.getRange("F3");
var to = sheet.getRange("F4");
to.setFormulaR1C1(from.getFormulaR1C1());
}
Универсальный метод
copyTo() требует дополнительных обязательных параметров, как
тип вставки и признак необходимости транспонирования массива перед вставкой. В даненом случае транспонирование
не требуется, поэтому значение этого аргумента будет
false. За тип вставки выбрано значение
SpreadsheetApp.CopyPasteType.PASTE_FORMULA, которое указывает, что копирование должно произойти с применением правил, принятых в Табличных процессорах. К таким правилам
относят смещение диапазонов и учет абсолютных значений адресов.
// Универсальный метод
function universalMethod(sheet){
var from = sheet.getRange("G3");
var to = sheet.getRange("G4");
var copyPasteType =
SpreadsheetApp.CopyPasteType.PASTE_FORMULA;
var transposed = false;
from.copyTo(to, copyPasteType, transposed);
}
Выводы
Результатом работы программы будет копирование двух ячеек с разными итогамиКак видно, при универсальном способе копирование формул произошло с ожидаемым результатом. Так же важно заметить, что форматирование, а значит и условное форматирование" и типы данных, сохранили свое состояние при изменении данных ячеек.
setFormula/setValues- добавляют формулу "как текст"setFormulaR1C1- добавляет формулу с учетом относительности указанных диапазоновcopyTo- сильно зависит от собственных настроек. Может добавлять как сами формулы, так и их текстовые выражения для последующей автоматической интерпретации
Направление диапазонов в copyTo
Диапазоны можно копировать не только одинаковых размеров, но и любых других размеров, где в качестве начальной точки вставки будет левый верхний угол диапазона назначения. Стоит обратить внимание на то, что при вставке в "бесконечные диапазоны" расширения Тблицы "вниз" и "вправо" не происходит. Что-то вроде такой настройки имеет место быть:
var from = sheet.getRange("A1:C1");
var to = sheet.getRange("B8");
Дополнительно
- Так же можно проверить, как работает метод
copyTo(), если будет задан абсолютный адрес в копируемой формуле, например,=JOIN(" ";C$3:E3) - Интересно наблюдать за разницей работы метода
copyTo(destination)без дополнительных параметров. Каков будет результат? - Получить ссылку на полный пример из поста можно в сообществе G+ Google Apps Script. Russian или чате @googleappsscriptrc
Комментарии
Отправить комментарий