Простая функция для отображения заметки в ячейке Google Sheets

#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() — это функции, которые требуют авторизации пользователя, а именно вы не можете вызывать их в рамках пользовательских функций (см. Ссылки).

Решения:

  1. Вы можете щелкнуть по интересующей ячейке, а затем выполнить следующую функцию:

     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);}
      
  2. Если вы хотите указать ячейку (скажем, 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