• Как перенести информацию?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Как я понимаю, решение

    =ARRAYFORMULA(QUERY({Regist!C2:C&Regist!B2:B\VALUE(Regist!A2:A)\Regist!B2:E};"Select Col1, avg(Col6) where Col5 matches'FIT' and Col2="&MAX(Regist!A2:A)&" group by Col1";0))
    Ответ написан
    Комментировать
  • Как получить предпоследнюю дату из списка по совпадениям в другом столбце?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Мне кажется, что эту задачу можно решить через SORTN, но вот что первое приходит в голову

    =LET(
      places;UNIQUE(A2:A);
      dates;BYROW(places;LAMBDA(_p;TO_DATE(INDEX(SORT(FILTER(B2:B;A2:A=_p);1;0);2))));
      {places\dates}
    )


    65d748ec053f9013780103.png

    Ссылка на Таблицу с примером https://docs.google.com/spreadsheets/d/1zPuzdN7EtT...
    Ответ написан
    1 комментарий
  • Как создать условие/скрипт/макрос для автоматического создания чекбоксов?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Вот этот простой код вставляет чекбоксы в заданный диапазон

    /**
     *
     * @param {GoogleAppsScript.Spreadsheet.Range} range
     * @returns
     */
    function insertCheckBoxesToRange_(range) {
      return range.insertCheckboxes();
    }


    Пример использования

    function userActionInsertCheckBoxes() {
      const sheet = SpreadsheetApp.getActive().getSheetByName('Вставить чекбокс скриптом');
      sheet.appendRow(['']);
      const lr = sheet.getLastRow() + 1;
      const range = sheet.getRange(`${lr}:${lr}`);
      insertCheckBoxesToRange_(range);
    }


    65d59b0fd1a2b045755380.png

    Ссылка на Таблицу с примером https://docs.google.com/spreadsheets/d/1zPuzdN7EtT...
    Ответ написан
    Комментировать
  • Возможна ли фильтрация и отображение определенных данных?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Пример недоступен.

    Из описания ясно, что вам потребуется парсить строки времени вида 00:00-06:00. Далее необходимо значение перевести в числа, т.к. это самый простой способ не ошибиться в сравнении и уже к этим данным наложить FILTER

    Если речь идет о фильтре данных, то нет, он не будет обновлять свои результаты, вам придется его переприменить.
    Ответ написан
    Комментировать
  • Реально ли написать скрипт для конвертации?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Да, это реально. Не видно никаких препятствий. Плюс, Apps Script умеют парсить xml в JS, так что это возможно.

    Как примерно реализовать:

    1. Получить данные из файла EPG через UrlFetch
      const xml = UrlFetchApp.fetch(url).getContentText()

    2. Распарсить данные через XMLService const document = XmlService.parse(xml)
    3. Получить текущие данные из Таблицы SpreadsheetApp, getDataRange().getValues()
    4. Сравнить с полученными данными из xml
    5. Если есть разница, то обновить Таблицу SpreadsheetApp, getDataRange().setValues()
    Ответ написан
    2 комментария
  • Почему происходит ошибка импорта?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    К сожалению, это может быть особенность хранения данных на стороне Гугл.

    Варианты, что можно попробовать:
    • Сделать копию проблемной Таблицы и подключить копию
    • Разгрузить проблемную Таблицу, возможно в ней много расчетов
    • Попробовать уменьшить количество потребителей конечной Таблицы (пользователей)
    • Попробовать уменьшить количество потребителей проблемной Таблицы (IMPORTRANGEей)
    Ответ написан
    Комментировать
  • Как отредактировать скрипт, чтобы он подставлял данные из Таблицы в Документ?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Предлагаю использовать универсальную функцию заполнения документа

    /**
     *
     * @param {GoogleAppsScript.Document.Document} doc
     * @param {Record<string,unknown>} data
     */
    function fillDoc_(doc, data) {
      const body = doc.getBody();
    
      Object.entries(data).forEach(([key, value]) => {
        body.replaceText(`(?i){{${key}}}`, value);
      });
    
      body.replaceText(`(?i){{.*?}}`, '');
    }


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

    const file = DriveApp.getFileById('192avJeIyh524ofvFvuQRaf9QPyqH7FKBEzwNLoHJa-g').makeCopy();
    const doc = DocumentApp.openById(file.getId());


    Важно, заменяемый текст в шаблоне должен быть обернут в {{заменяемый текст}}.


    Так же нужно создать объект данных для функции. Например, вот так

    const values = SpreadsheetApp.getActive()
      .getRange("'Заполнение Документа данными из Таблицы'!2:2")
      .getDisplayValues()[0];
    const data = {
      заголовок: 'тестовый заголовок',
      имя: values[1],
    };


    Вызов функции прост

    fillDoc_(doc, data);

    Полный пример шаблона тут https://docs.google.com/document/d/192avJeIyh524of...

    Полный пример в Таблице https://docs.google.com/spreadsheets/d/1zPuzdN7EtT...
    Ответ написан
    Комментировать
  • Как эту формулу прописать в Google Apps Script?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Положим, что вам нужно заменить работу функции, т.е. вернуть тоже самое значение, но только "вписать" данные скриптом

    function calcData() {
      const book = SpreadsheetApp.getActive();
    
      const spravochnik = book.getRange("'Как заменить формулу скриптом'!M2:N5")
        .getValues().reduce((a, r) => {
          if (r[0] && r[1]) {
            a[r[0]] = r[1];
          }
          return a;
        }, {});
    
      const headersX = book.getRange("'Как заменить формулу скриптом'!D2:G2").getValues()[0]
        .map(h => spravochnik[h] || 0);
    
      const voprosData = book.getRange("Как заменить формулу скриптом!D3:G8")
        .getValues();
    
      const voprosData2 = book.getRange("Как заменить формулу скриптом!H3:I8")
        .getValues();
    
      const values = voprosData.map((row, j) => {
        return [row.reduce((a, v, i) => a + headersX[i] * v, 0)
          + +voprosData2[j].reduce((a, v) => a + v, 0)];
      });
    
      book.getSheetByName("Как заменить формулу скриптом")
        .getRange(3, 10, values.length, values[0].length).setValues(values)
        .activate();
    }


    Теперь можно назначить calcData как вызов для триггера события Edit. Если добавляете в событие, то нужно еще будет проверить имя активного листа и изменяемый диапазон.

    65d36730515e7538286690.png

    Пример в Таблице https://docs.google.com/spreadsheets/d/1zPuzdN7EtT...
    Ответ написан
    1 комментарий
  • Можно ли использовать интерфейс Таблиц для своего сайта?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Заголовок не отражает содержимое вопроса, так что ответов положительных и не будет.

    Это вопрос не про встраивание Таблиц на сайт, а про использование интерфейса Таблиц для своих данных. Кликбейт

    1. Нет, т.к. интерфейс Таблиц неотрывно связан с содержимым сервиса Таблиц, они не предназначены для работы с внешними данными
    2. Только если встраивать Таблицы через iframe или же писать свой интерфейс, поддерживаемый Google Sheets API
    3. Нет, см. п. 1
    4. Нет, но можно реализовать как в п. 2
    Ответ написан
    Комментировать
  • Как просмотреть содержимое сгруппированных строк в режиме гостя?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Только через скрипт или сделать копию Таблицы, если это возможно. Можно еще попробовать импортировать данные из этого листа в другой лсит/Таблицу через формулу IMPORTRANGE.
    Ответ написан
    Комментировать
  • Не могу определится в верном выборе триггера simple or installable?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Триггера "onEdit" не существует. Существует простой и устанавливаемый триггер события "Edit". onEdit - зарезервированное имя функции для простого триггера.

    Простой триггер срабатывает для каждого, устанавливаемый - для того, кто установил.

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

    В обычных Таблицах (не Workspace), если пользователь вам не представился, не ищите возможности его идентифицировать, Гугл все время добавляет ограничения на эти действия, поэтому потом вы свой "прекрасный код" будете называть "костылями", а потом он вообще перестанет работать. Это бесплатно, а значит ограничено.
    Ответ написан
    Комментировать
  • Можно ли обойти ограничение в 1000 ячеек на график?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Для визуализации больших данных используйте Google Looker, который работает напрямую с Таблицами.
    Ответ написан
    Комментировать
  • Как скриптом достать ссылку из ячейки?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Самое простое, это взять ячейку, у нее есть метод getRichTextValue(), возвращаемый объект имеет метод getLinkUrl().

    cell.getRichTextValue().getLinkUrl();

    Извлечь ссылки из диапазона

    /**
     *
     * @param {GoogleAppsScript.Spreadsheet.Range} ref
     */
    function extractLink_(ref) {
      const richTextValues = ref.getRichTextValues();
      return richTextValues.map((row) =>
        row.map((cell) => {
          return cell.getLinkUrl();
        }),
      );
    }


    65d0548379b9c072210595.png

    Пример в Таблице https://docs.google.com/spreadsheets/d/1zPuzdN7EtT...
    Ответ написан
    Комментировать
  • Как открыть почтовый клиент через макрос?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Решение Григорий Боев https://qna.habr.com/answer?answer_id=2404940#answ... единственное.

    Более удобным может быть настройка Gmail на отправку писем от имени других аккаунтов, даже аккаунтов Microsoft Live или как там сейчас их MySpace называется.

    Еще вариант, забирать данные из Таблицы вашим клиентом Outlook, который, тоже содержит "макросы" и прочее, прочее. На Таблицах и Скриптах свет клином не сошелся, хоть они и самый удобный инструмент.
    Ответ написан
    Комментировать
  • Форма перестала записывать данные в таблицу ответов. Как исправить?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Вы не должны никаким образом редактировать Таблицу. Редактируйте Форму, т.к. она источник данных.

    Выгрузите Форму в новую Таблицу и увидите все прежние данные. Новые ответы также будут приходить.

    Еще раз: не меняйте данные в Таблице на листе, куда привязана Форма - это неверное понимание механизма работы с данными. Соблюдайте ПРФ https://gist.github.com/oshliaer/45242e42d50a39b0a...
    Ответ написан
    2 комментария
  • Почему перестает определяться пользовательская функция после определенного времени?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Однозначного ответа нет. Кстати, этим вы нарушаете правила ресурса. Вот несколько вариантов:
    • Неудачно написанный код, глобальные объекты, запрещенный вызов, авторизация
    • Ожидание загрузки, тяжелая Таблица
    • Плохая Таблица (тут можно попробовать сделать копию)
    Ответ написан
    Комментировать
  • Как переместить определенную строку на другой лист и в другую Таблицу?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Это можно сделать только программно.

    Специально для таких вопросов сделали пример https://googlesheets.ru/kak-perenesti-stroku-iz-ta...

    Обратите внимание, там данные переносятся на лист с тем же именем, что и данные в ячейке, но код написан таким образом, чтобы его можно было применить для подобных задач. Например, такой как ваша.
    Ответ написан
    Комментировать
  • Как разрешить редактирование листа сегодняшней даты?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Это делается через Google Apps Script.
    Ответ написан
  • Как разграничить доступ к вкладкам?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    К сожалению, вы не можете передать информацию о форматировании, только данные.
    Другой способ - использовать программу. Это может быть самописный скрипт или подписка на какой-то сервис.
    Ответ написан
    Комментировать