К основному контенту

Форматирование строки при отправке Формы


Некоторые пользователи предпочитают, чтобы форматирование присутствовало на всех листах. При отправке Формы в Таблицу добавляется новая строка, и она не заимствует никакого форматирования. Справиться с этой проблемой может устанавливаемый на событие onFormSubmit скрипт следующего содержания:
/**
 *
 * @param {GoogleAppsScript.Events.SheetsOnFormSubmit} e
 */
function onformsubmit(e) {
  const sheet = e.range.getSheet();
  sheet
    .getRange('1:1')
    .copyTo(sheet.getRange(`${e.range.getRow()}:${e.range.getRow()}`), {
      formatOnly: true,
    });
}

Посмотреть как это работает можно тут:
Не забудьте зарегистрировать функцию onformsubmit для события On Form submit

Что происходит:
  1. Событие вызывает onformsubmit
  2. Получаем текущий лист
  3. Берем диапазон "1:1" листа
  4. Копируем только форматирование в диапазон, который изменился благодаря форме
3й пункт можно поправить под текущие требования, например, это может быть вторая строка '2:2'.

Комментарии

  1. А как будет выглядеть функция автосортировки Ответов, т.е. при отправке Формы в Таблицу добавляется новая строка и она становиться первой в списке?

    ОтветитьУдалить
    Ответы
    1. До сих пор не рекомендуют этого делать, т.к. Форма привязывается к конкретной области данных. Создайте новый лист и перенесите туда данные с помощью формулы. Например, SORT или QUERY

      Удалить
    2. использовал Sort, но дело в том, что в Ответах есть поле, где надо поставить отметку (в моем случае это поле с Флажком) и вот в этом случае сортировка при помощи формулы не годится, она сразу уходит в ошибку. На просторах инета я нашел вот такие коды по автосортировке:

      function onEdit() {
      var sheet = SpreadsheetApp.getActiveSheet();
      var range = sheet.getRange(3, 1, sheet.getLastRow() - 2, sheet.getLastColumn());
      range.sort({column: 1, ascending: false});
      }

      или

      function onEdit(event){
      var sheet = SpreadsheetApp.getActiveSheet();
      var editedCell = sheet.getActiveCell();
      var columnToSortBy = 1;
      var tableRange = "A2:H"; // What to sort.
      if(editedCell.getColumn() == columnToSortBy){
      var range = sheet.getRange(tableRange);
      range.sort( { column : columnToSortBy, ascending: true } );
      }
      }

      Они работают, но если только нажать на выполнение в редакторе скриптов. Я простой юзер google docs, незнакомый с JS поэтому подскажите, пж, что значит зарегистрировать функцию для события On Form submit? И как все это "допилить"?

      Удалить
    3. Первый код у вас должен работать при каждом изменении данных пользователем. Например, вы ставите галочку в Таблице (не в Форме).

      Приведите пример ваших данных. А лучше пример Таблицы и Формы сразу.

      Удалить
    4. Да, так и есть, работает если в самой таблице изменения делать, поэтому я так понял надо увязать событие на форме еще..
      Высылаю Форму и Ответы:
      https://forms.gle/tPJ89A9Hkgrkk8x19
      https://docs.google.com/spreadsheets/d/1itCtCDvUF__GuVRZwTfEnNa_YgwWY6b-8XT4amG1I8w/edit?usp=sharing

      Удалить
    5. Мне нравится вот такой вариант

      https://github.com/contributorpw/google-apps-script-snippets/blob/master/snippets/sheets/sort_sheet_when_form_submit/sort_sheet_when_form_submit.js

      Вы все еще должны зарегистрировать триггер отправки Формы для функции onformsubmit. Для этого найдите в меню опцию "Триггеры текущего проекта" и добавьте функцию для соответствующего события.

      Удалить
    6. В этом примере Таблица одновременно форматируется и сортируется. Хотя, вероятно, форматирование вам ни к чему. Просто удалите лишний код, оставьте только вызов onEdit из onformsubmit

      Удалить
    7. Спасибо, вставил в редактор, к сожалению код не сортирует автоматически, только после ручной манипуляции.. (

      https://forms.gle/tPJ89A9Hkgrkk8x19
      https://docs.google.com/spreadsheets/d/1itCtCDvUF__GuVRZwTfEnNa_YgwWY6b-8XT4amG1I8w/edit?usp=sharing

      вставил и в форму и в таблицу, зарегил триггер и там и там, не работает (

      Удалить
    8. Отправил запрос на редактирование. Вероятнее всего, что-то с триггером.

      Удалить
    9. Добавил код установки https://github.com/contributorpw/google-apps-script-snippets/blob/master/snippets/sheets/sort_sheet_when_form_submit/sort_sheet_when_form_submit.js Скопируйте код и запустите install один раз из редактора.

      Удалить
  2. Просто когда много строк, то приходится крутить таблицу в самый низ, что совсем неудобно

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

Удаление строк по условию

Часто возникает задача удаления строк из Таблицы Google по какому-либо условию. Разнообразие условий так велико, что порой приходится создавать метод "удаления строк" снова и снова. Довольно утомительно. Для простых офсных скриптов можно применить сниппет, описанный ниже. Основная идея заключается в том, чтобы взять весь массив данных и перебрать его в обратном порядке. При переборе каждая строка передается в функцию обратного вызова, которая принимет решение удалить строку или нет. Для оптимизации количество последовательных строк суммируется, и для удаления применяется метод deleteRows(rowPosition, howMany) класса Sheet В примере ниже скрипт удаляет строки автивного листа, в которых ячейки из диапазона D27:D77 и F27:F77 попарно пустые

Триггеры Google Apps Script

Все триггеры в скриптах делятся по виду события, типу установки и области применения. Области применения Таблицы Формы Документы Сайты Автономные скрипты  События Open - происходит при открытии файла в приложении Гугл. Например, Формы создают это событие только при открытии в режиме редактирвоания. Edit - происходит при завершении ввода данных в ячейку Таблицы пользователем. Только Таблицы. Только пользователем. Install - автоматически вызывается при установке дополнения. Change - возникает при других (не изменение данных ячейки, например, назначение цвета или ширины колонки) изменених Таблицы вызванных пользователем. Только Таблицы. Только пользователем. Form submit - исполнится только тогда, когда придет ответ от респондента Формы. Time-driven - отложенный триггер действия, срабатывающий по истечении времени Get - событие отрабатывающее get-запросы к веб-приложению Post - событие отрабатывающее post-запросы к веб-приложению Типы установок Simple trig

Как открыть ссылку с помощью Google Apps Script?

Часто возникает задача, в которой требуется по результатам работы скрипта открыть ссылку в новом окне/вкладке браузера. В Google Apps Script не существует методов взаимодействия с браузером. Единственная более-менее реальная связь между пользователем и сервером скрипта находится в интерфейсе реализуемой программы. Это может быть Таблица, Документ или Web приложение. Все они реализуются через HtmlService. Например, SpreadsheetApp.getUi().showModelessDialog(htmlOutput, "title"); Понятно, что в построенном htmlOutput , можно выполнить код для текущего window . Например, window.open(url, "_blank"); Идея обернутая кодом ниже по тексту. Пользователь выбирает ячейку в Таблице (или все, что угодно, что формирует ссылку). На сервере На клиенте строится окно диалога, открывается новая вкладка браузера и закрывается окно диалога, при успешном выполнении условия. Иначе появляется сообщение, что переданный параметр не ссылка. Этот метод имеет существенный недостаток