1

Я пытаюсь создать пользовательскую функцию электронной таблицы GAS, которая копирует содержимое ячеек в другие ячейки. И мне нужно заполнить целевые ячейки не только данными исходной ячейки, но и содержимым формулы (если она есть).Чтение и запись формул ячеек из пользовательской функции Google Apps Script

Теперь я уже знаю, что это невозможно в принципе благодаря пользовательским функциям, поскольку они всегда получают результат вычислений ячейки, но не сами формулы ячеек, и они также не могут возвращать формулы для своих целевых ячеек.

С другой стороны, существуют функции для чтения и записи формул ячеек, например. Range.getFormula() и Range.setFormula(), которые, похоже, делают мое стремление возможным. Мне просто нужно найти другой способ позвонить им. UPDATE: Тем временем я обнаружил, что пользовательские формулы в самом деле могут читать формулы с использованием getFormula(), но они, безусловно, не имеют разрешения на написать формулы в клетки с помощью setFormula().

Мой вопрос ...

Что бы самый элегантный способ создать что-то эквивалентное пользовательскую функцию, которая считывает и записывает формулу содержимое ячеек? Я думаю, что я мог бы использовать функцию onEdit, которая обновляет мои целевые ячейки после каждого редактирования электронной таблицы, но это будет означать, что мне приходится жестко кодировать координаты диапазона целевых ячеек, что кажется очень взломанным и потребует изменения кода каждый раз, когда целевой диапазон (например, когда над ним вставлены строки).

ОБНОВЛЕНИЕ: Пример

Примером может быть пользовательской функцией, которая может считывать несколько диапазонов ячеек (каждый диапазон заданного в качестве отдельного параметра функции) и возвращает соединенный диапазон ячеек.

=rangeJoin(A1:B10;D1:E15)

... будет читать два диапазона размера 2x10 и 2x15 и заполнит целевой диапазон размера 2x25 с последующим содержимым ячейки обоего диапазонов. Целевой диапазон начнется в ячейке, которая содержит rangeJoin и будет распространять 2 ячейки вправо и 25 ячеек вниз (как обычно для пользовательской функции). Пользовательская функция (или аналогичный механизм) должна иметь возможность копировать формулы, поэтому ячейка, содержащая =hyperlink("http://www.google.com";"Google"), должна отображаться в целевом диапазоне как гиперссылка, а не как текстовая ячейка с обнаженным словом «Google».

+0

Как насчет небольшого всплывающего пользовательского интерфейса, который попросит вас выбрать диапазон назначения? Будет ли это полезно в вашем случае? Функция может быть вызвана кнопкой или меню или даже при каждом редактировании. Дайте нам знать, что вы думаете. :-) –

+0

Hi @Sergeinsas, если честно, я надеялся, что будет более оптимизированное решение, которое все равно сможет определить происхождение и целевые диапазоны через какой-либо маркер в клетка. – Jpsy

+0

Есть, конечно!Но в вашем вопросе неясно, какова эта связь между источником и целью на самом деле. Не могли бы вы точно объяснить? Вы также упомянули, что это может измениться ... прошу пояснить –

ответ

2

Согласен с "Mogsdad"

ie. эта специальная функция работает:

function myGrid() { 
    return [[1,2],[3,"http://www.google.com"]]; 
} 

но, пользовательские функции не могут писать формулы на листе. См. https://developers.google.com/apps-script/execution_custom_functions#permissions

В качестве обходного пути вы можете использовать «Триггер», например, триггер, основанный на времени, как предлагает «Mogsdad».