#google-apps-script #google-sheets #custom-function
#google-приложения-скрипт #google-sheets #пользовательская функция
Вопрос:
(Обновлено, чтобы удалить глупую предыдущую ошибку!)
Я пытаюсь написать простую функцию, позволяющую ячейке содержать заголовок, а затем содержать дополнительную информацию в заметке, что-то вроде этого:
Мой код на данный момент:
function TEXTNOTE(celltext, notetext){
setNote(notetext);
return celltext;
}
Это возвращает ошибку, потому что setNote не определен — поэтому я предполагаю, что мне нужно [что-то].setNote — но что должно [что-то] быть?
Комментарии:
1. Я прошу прощения, что я думал, что ваша функция
setNote()
была создана для размещения заметки вами. Но я думаю, что существующий ответ решит вашу проблему.2. В целях документации, пожалуйста, примите ответ, который помог вам больше всего. Это поможет будущим читателям и сообществу.
Ответ №1:
Объяснение:
Я понимаю, что вы хотите использовать пользовательскую функцию. Однако существует следующее ограничение:
setValue() и setNote() — это функции, которые требуют авторизации пользователя, а именно вы не можете вызывать их в рамках пользовательских функций (см. Ссылки).
Решения:
-
Вы можете щелкнуть по интересующей ячейке, а затем выполнить следующую функцию:
function TEXTNOTE(){ const celltext = "Cell title"; const notetext = "Note text" ; const sheet = SpreadsheetApp.getActive().getActiveSheet(); const cc = sheet.getCurrentCell(); cc.setNote(notetext); sheet.getRange(cc.getA1Notation()).setValue(celltext);}
-
Если вы хотите указать ячейку (скажем, A1) в скрипте и вы не хотите нажимать на нее, вы можете просто запустить следующее:
function TEXTNOTE(){ const celltext = "Cell title"; const notetext = "Note text" ; const sheet = SpreadsheetApp.getActive().getActiveSheet(); const cc = sheet.getRange('A1'); cc.setNote(notetext); cc.setValue(celltext);}
Дополнительные примечания:
-
Вы можете выполнить вышеупомянутые функции, либо нажав на кнопку воспроизведения в редакторе сценариев, либо вы можете создать пользовательское боковое меню, которое позволит вам выполнить функцию из файла электронной таблицы.
-
Если вы хотите выполнить эту задачу итеративно, то вам нужно предоставить список заголовков и заметок и запустить цикл, чтобы применить эту операцию к каждой ячейке. Если вы хотите, чтобы значения
celltext
иnotetext
извлекались из вашего скрипта, вам нужно будет создать две выделенные колонки для предоставления этой информации.
Пример:
Ссылки:
В отличие от большинства других типов скриптов приложений, пользовательские функции никогда не просят пользователей разрешить доступ к личным данным. Следовательно, они могут вызывать только службы, которые не имеют доступа к личным данным.
Комментарии:
1. Первая версия возвращает две строки текста, а вторая версия выдает ошибку (Ошибка ReferenceError: setNote не определен (строка 2).)
2. Я обновил вопрос, чтобы показать, каким я хотел бы видеть результат. setNote является частью API Google Apps Script, он, безусловно, отлично работает с [cellreference].setNote («Текст заметки»).
3. Это ближе, но я хочу посмотреть, есть ли что-то, что может выполняться как функция в стиле вычислений — например, «текст заметки» вполне может быть не простой строкой, поэтому я не хочу, чтобы пользователю приходилось нажимать на нее, чтобы обновить ее (может сработать событие наведения курсора мыши, однако лист уже довольно большой, так что это может сильно замедлить работу).
4. @MattBowyer вы понимаете, что это другой вопрос. Теперь вам нужно предоставить 3 столбца. Один столбец будет
title
, второй столбец будетnote text
, а третий будет нужной ячейкой, которую вы хотите отредактировать. Если вам не нужна эта структура, тогда вам придется передать заголовок и текст заметки в самом вашем скрипте. Но это уже другой вопрос.5. Я обновил свой ответ, решение 2 не требует нажатия на ячейку. @MattBowyer