Ответы пользователя по тегу Google Apps Script
  • Есть ли боты для дискорда, которые автоматически записывают инфу в гугл таблицы?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Используйте хуки Дискорда и дергайте Google Apps Script веб-приложение.

    Скорее всего делов на 15 мин.
    Ответ написан
    Комментировать
  • Как изменить сохранение ответов на гугл диск в гугл форме?

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

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

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Дополню ответ Григорий Боев

    Вы можете добавить проверку наличия данных после работы формулы через Apps Script и получите довольно удобное приложение.
    Ответ написан
    Комментировать
  • Как сделать макарос для активации фильтра?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Используйте Google Apps Script.

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

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Используйте метод setNote класса Range

    const range = SpreadsheetApp.getActive().getSheetByName('Хер пойми').getRange('A1');
    range.setNote(counts);
    Ответ написан
    4 комментария
  • Как подсветить строку активной ячейки в Google sheet?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Есть отличное расширение для браузера matsu7089/sheets-row-highlighter

    103460310-7d533d00-4d58-11eb-8f86-55bd93330d43.jpg

    104900953-17092400-59c0-11eb-9471-83c91f8f3192.jpg
    Ответ написан
    Комментировать
  • Как автозаполнить точками содержание в Google docs?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Для вставки содержания с точками выберите Меню - Вставка - Содержание - Формат

    Важно, Документ должен быть разбит на листы, в режиме pageless этой опции нет


    65fd645470e59450181281.png
    Ответ написан
    Комментировать
  • Можно ли ускорить копирование данных из одних столбцов в другие в Google таблицах?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Не задавайте вопросы без примера!


    Зачем вы делаете все те манипуляции - не понятно. Это последствия Excel?

    Занимает доли секунды

    /* exported userActionCopyValues */
    function userActionCopyValues() {
      copyValues_('rg');
    }
    
    function copyValues_(e) {
      const sheet = SpreadsheetApp.getActive().getSheetByName('Ускорить работу скрипта');
      const dataRange = sheet.getDataRange();
      const values = dataRange.getValues();
    
      const lastValKMNOV = values.findLast((row) => row[11] === e);
    
      if (!lastValKMNOV) {
        console.warn(`lastValKMNOV ${lastValKMNOV}`);
        return;
      }
    
      const lastIndexBF = values.findLastIndex((row) => row.slice(1, 1 + 5).join(''));
    
      if (lastIndexBF === -1) {
        console.warn(`lastIndexBF ${lastIndexBF}`);
        return;
      }
    
      sheet
        .getRange(lastIndexBF + 2, 2, 1, 5)
        .setValues([[lastValKMNOV[10], lastValKMNOV[11], lastValKMNOV[12], lastValKMNOV[13], lastValKMNOV[21]]]);
    }


    65fbc8ba1bbea534262777.png

    Пример в Таблице https://docs.google.com/spreadsheets/d/1KN2SuXbHN5...
    Ответ написан
    Комментировать
  • Как оптимизировать код и исправить ошибку Exceeded maximum execution time?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Никак не оптимизировать, т.к. это облачные вычисления.

    Следующие методы сами по себе требует время:
    • makeCopy
    • saveAndClose


    Рассмотрите вариант порционного создания файлов. Тут может быть два подхода:
    1. Создание через самозапускаемый триггер. Т.е. триггер, который вызывает сам себя, пока не кончатся задания
    2. Вызов функции в интерфейсе пользователя. Это когда создание каждого документа вызывается через google.script.run на стороне клиента


    Помните, что в сутки один пользователь может создать только 200 Документов.
    Ответ написан
    Комментировать
  • Ошибка в скрипте при создании файлов по шаблону и информации из гугл таблицы?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Эта ошибка возникает из-за того, что вы делаете копию файла в цикле и открываете ее для редактирвоания. Сервис Документов не такой скорый как китайский поезд, поэтому, не всегда это работает.

    Попробуйте брать файл шаблона в цикле, хоть это и неэффективно
    Попробуйте добавить паузу после сохранения

    Хорошей таблетки для этой проблемы нет. Может быть только если использовать Advanced Service Docs
    Ответ написан
    Комментировать
  • Как создать условие/скрипт/макрос для автоматического создания чекбоксов?

    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 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 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 комментарий
  • Не могу определится в верном выборе триггера simple or installable?

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

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

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

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

    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 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.
    Ответ написан