Задать вопрос
  • Как связать 2 Google Form между собой?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Задача нетривиальная. Даже не знаю, стоит ли ее решать через Google Apps Script.

    Положим, что есть две Формы. Во-первых, необходимо место под генерацию промокодов. А это должна быть Таблица. Во-вторых, при использовании промокода необходимо выяснить его валидность. А, ну далее продолжать не стоит - Формы неинтерактивны. Форма - это интерфейс сбора информации. Интерфейс - это совокупность средств, методов и правил взаимодействия, в котором нет возможности обратной связи. У разработчика нет доступа к реализации таких методов как загрузка Формы, проверка данных на стороне клиента и пр. Т.е. разработчик не в состоянии реализовать интерфейс Форм.
    Ему доступен интерфейс хранилища Форм. Т.е. разработчик может обратиться по адресу к Форме, получить ее данные, изменить ее свойства.

    Только качественный и проверенный контент
    Ответ написан
  • Как настроить автоответчик писем на заполнение форм на разных языках?

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

    Главная ошибка - это ссылка на активную Таблицу SpreadsheetApp.getActiveSpreadsheet(); В триггере OnFormSubmit не может быть активной Таблицы, потому что никакой пользователь ее не открыл. А если даже и открыл, то он может не быть регистратором триггера или его инициатором.

    Обработка ошибок
    Google Apps Script (речь о данном моменте времени развития языка) не имеет развитых методов отладки. Поэтому обвяжите основной вызов:
    /**
    * В Таблице должен быть лист "Лог".
    * Чтобы лист существовал всегда
    * https://github.com/oshliaer/google-apps-script-snippets#get-a-sheet-by-name
    **/
    function handler(e) {
      try {
        sendFormByEmail(getNewEmailMessage(e));
      } catch(err) {
        e.source.getSheetByName('Лог').appendRow([new Date(), err.message, err.stack]);
      }
    }

    Отлично, теперь все, что упало в рантайме, будет вам известно.

    Текущая Таблица/Лист
    Я приываю не только автора топика, но вообще всех: "Пожалуйста, не трогайте ActiveSpreadsheet, ActiveSheet и ActiveRange, т.к. это не VBA. Это #ВАЩЕ_НАФИГ_ДРУГАЯ_ВСЕЛЕННАЯ!". Обратите внимание на код выше e.source.getSheetByName(). Это все, что надо.
    А вот пример комутатора:
    /**
    * Определение языка на основе ответа
    **/
    function getNewEmailMessage(e) {
      var sheet = e.range.getSheet();
      var lang = 'EN';
      switch(sheet.getName()){
        case 'RU':
           return 'Ответ на русском';
           break;
        case 'EN':
           return 'Ответ на нерусском';
           break;
      }
      return 'Ответ на русском';
    }

    Осталось добавить аргументов и переписать sendFormByEmail согласно принимаемым параметрам.

    Триггер на несколько Форм

    Вместо заключения
    Только качественный и проверенный контент
    Ответ написан
    4 комментария
  • Почему не работает Get запрос в Google Apps Script через file_get_contents?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Виктор Фамильевич, для того, чтобы вызвать такой запрос, ваш сервер должен передать код аутентификации владельца или редактора проекта скрипта в заголовках. Это необходимо потому, что вызывается url разработчика для тестирования. Т.е. этот адрес нельзя использовать для нормальной работы.

    Самый простой способ вызвать корректно сервис - это опубликовать его. Ссылки очень легко отличаются по своим окончаниям:
    • /dev - адрес для тестирования
    • /exec - текщий адрес приложения


    Подробности Web Apps / Deploying a script as a web app
    Консультации по GS
    Ответ написан
    Комментировать
  • Удобоваримые ответы из google forms в spreadsheet, как правильно?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Не используйте "обработку формулой по триггеру" в данном случае. Вам просто необходим скрипт, который будет преобразовывать текущие данные в подходящие для отчета формы. Без примера сложно сказать, как именно необходимо разделить данные, но в общем случае это будет выглядеть как-то так https://productforums.google.com/forum/#!topic/doc... Там задача несколько сложнее чем у вас, рассчитываются веса вхождений для каждого ответа. Скопируйте Таблицу, в ней появится меню генерации отчета.

    Консультации https://google-apps-script-russian.gitlab.io/page/...
    Ответ написан
    Комментировать
  • Как отфильтровать таблицу по определенному тексту в столбце?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Используйте опцию "Filter by condition..." См. "фильтровать по условию".
    Ответ написан
    Комментировать
  • Суммирование по цвету ячеек и цвету шрифтов?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Custom Count and Sum - дешево и сердито.
    Ответ написан
    Комментировать
  • Как работать в google script с защищенными листами google таблиц?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Вам нужны два скрипта:
    1. Сервер-приемник (запускается от имени владельца защищенного диапазона)
    2. Программа-инициатор (запускается от имени пользователя)


    Вам необходимо будет решить несколько проблем:
    • Определение подлинности программы-инициатора на сервере
    • Контроль команд на выполнение
    • Согласованная разработка и поддержка двух программ
    Ответ написан
    Комментировать
  • Как заставить работать скрипт дистанционно?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Рассмотрите две возможные проблемы:

    Во-первых. Прежде чем отправлять запрос, ваше приложение должно авторизоваться через и получить токен.
    This method requires authorization with an OAuth 2.0 token that includes at least one of the scopes listed in the Authorization section; script projects that do not require authorization cannot be executed through this API.


    Во-вторых: У вас 404 ошибка. Ресурс не найден. Проверьте коррекность адреса
    POST https://script.googleapis.com/v1/scripts/{scriptId}:run

    В данном случае {scriptId} - это уникальный номер самого скрипта, который находится в меню Файл - Свойства проекта - Ключ проекта

    Если вы не хотите авторизовываться, но вам очень надо отправить POST, попробуйте
    function doPost(e) {
      return ContentService.createTextOutput(JSON.stringify({status: 'ok'}))
        .setMimeType(ContentService.MimeType.JSON);
    }


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

    Добавлено

    Еще одной частой проблемой является необходимость вручную добавить в файл манифеста области видимости для скрипта, чтобы он мог иметь доступ к Script API.
    Ответ написан
    1 комментарий
  • Как сделать COUNTIF по условию соседнего столбца?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Вероятнее всего вам нужна формула COUNTIFS()
    Например,
    =COUNTIFS(A2:A9,"=Яндекс.Такси",B2:B9,"=Стоимость")

    Пример Таблицы с полями выбора

    2ff795ba82e44844a2e99880c6ea9ee5.png
    Ответ написан
    1 комментарий
  • Можно ли загружать фаилы с сервера на Google drive с их api без OAuth 2.0?

    oshliaer
    @oshliaer
    Google Products Expert
    AlexStolman,
    Authorizing Your App with Google Drive
    All requests to the Google Drive API must be authorized by an authenticated user. Google Drive uses the OAuth 2.0 protocol for authenticating a Google account and authorizing access to user data. You can also use OAuth 2.0 or Google+ Sign-in to provide a "sign-in with Google" authentication method for your app #REF

    Поэтому выход только один PHP Quickstart.
    Простым вариантом может быть поиск приложения или расширения (как это в PHP?) вашего фреймворка (или у вас все от руки?) для работы с Диском.

    С уважением.
    Ответ написан
    Комментировать
  • Можно ли полностью расшарить Google Drive?

    oshliaer
    @oshliaer
    Google Products Expert
    Алексей Савчук,
    • Если речь идет об обычном частном аккаунте, то нет. Как вариант можно написать скрипт, который будет добавлять (не перемещать) в заданную папку все что видит и назначать права.
    • В Google Apps for Work администратор домена имеет такие привилегии.

    С уважением.
    Ответ написан
    Комментировать
  • Как отправить данные javaScript - ом в гугл таблицы?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    1. Ваша функция на сервере Google Apps Script ничего не возвращает.
    2. Ваш сервер на Google Apps Script ожидает GET-запрос.

    Код сервера
    function doPost(e){
      var response = {};
      try {
        var sheet = SpreadsheetApp.openById('1iZazQ8YSMa6b9WFKTHJ99WooEC48nH9IF1x9fh6dQ9Y');
        sheet.appendRow([new Date(), JSON.stringify(e)]);
        response = {'result': 'OK'};
      } catch(err) {
        response = {'error': 'error'};
      } finally {    
        return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
      }
    }


    С уважением.
    Ответ написан
    Комментировать
  • Как сделать выпадающий список с добавлением новых элементов?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Здравствуйте,

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

    Идея larionov_n похожа на выстрел из пушки по воробьям. Почему бы тогда не использовать нормальную БД вместо кастрированного табличного процессора? Но, в то же время, могу сказать, что манипулирование Таблицей через внешнее приложение с AngularJS на фронте самое популярное в моих заказах. Т.е. на свой вопрос я найти ответа не могу.
    Ответ написан
    Комментировать
  • Как избежать timout в 6 минут при разработке дополнения?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Здравствуйте.

    Никак.
    Script runtime 6 min / execution и добавьте к ним Triggers total runtime 1 hr / day , а еще URL Fetch data received 50MB / day (хотя не понятно, что вы там такое втягиваете). Вам необходимо завести собственный сервер.

    Еще возможно, что страдает логика приложения.

    С уважением.
    Ответ написан
    1 комментарий
  • Как сделать вложенный цикл в google spreadsheet?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Ни при каких обстоятельствах не дразните систему setValue(), да еще и во вложенном цикле. Запись происходит не на ваш ПК, а на сервер. Кому понравится, когда его так дергают?

    Чтобы работало даже с "черновиками", т.е. до 50 000 строк на лист, сначала берите ВСЕ данные, потом формируйте ГОТОВЫЙ массив, потом делайте setValue().

    Примерно так:
    function writeData(){
      //Не факт, что поможет, но вдруг
      SpreadsheetApp.flush();
      
      //Далее как у всех
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      
      var resultSheet = ss.getSheetByName("Result");
      var agentsSheet = ss.getSheetByName("Buyers");
      var productsSheet = ss.getSheetByName("Products");
      
      var aV = agentsSheet.getDataRange().getValues();
      var pV = productsSheet.getDataRange().getValues();
      
      //срезать шапку
      aV.shift();
      //  pV.shift();
      
      var res = [];
      
      for(var i = 0; i< aV.length; i++)
      {
        res.push([].concat([aV[i][0]], pV[0]));    
        for(var j = 1; j < pV.length; j++){      
          res.push([].concat([''], pV[j]));      
        }
      }
      
      res = res.slice(0, 50000);
      resultSheet.getDataRange().clear(); 
      resultSheet.getRange(1, 1, res.length, res[0].length).setValues(res);
    }
    Ответ написан
    1 комментарий
  • Как связать или внедрить данные в Google Docs?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Технически это возможно с большими оговорками.

    Во-первых, не сравнивайте сервисы Google с настольным приложением, это позволит более трезво взглянуть на вещи.
    Во-вторых, встроенных средств не существует. И, если еще раз прочитать "во-первых", они и не нужны.
    В-третьих, можно извернуться и программно добавлять значения в Документ, но это довольно хлопотно. В конце-концов в Google Apps Script есть некий класс Class Range, который, все же, пока болтается без дела.

    Это все, что можно сказать по существу на данный момент.
    Обычно решают вопрос созданием шаблонов и генерацией на их основе новых Документов, а не преобразованием текущего.

    Обновление от 2019-01-23
    Существует возможность "привязать" Таблицу к Документу. Необходимо выделить диапазон Таблицы, скопировать в буфер и вставить в Документ. Пример https://vk.com/wall-174824632_8
    Ответ написан
    Комментировать
  • Какая формула вернет название Листа в ячейку?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Здравствуйте.

    Можно создать собственную функцию на основе Google Apps Script.
    Code.gs
    function sheetName() {
      return SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getName();
    }
    
    function sheetsName() {
      return SpreadsheetApp.getActiveSpreadsheet().getSheets().map(function(s){return s.getName()});
    }

    В Таблице необходимо указать формулу для получения имени активного листа
    =sheetName(E5:E13)
    Для получения списка всех листов
    =sheetsName(E5:E13)
    где E5:E13 особый, обязательно активный, т.е. зависящий от ввода пользователя, диапазон. Без изменения этого диапазона, толку от функции будет мало.
    Внимание, функции времени (TODAY(), NOW()) нельзя передавать как аргументы.

    Пример Таблицы со скриптом goo.gl/w97FNi

    P.S.: Чтобы исключить гнев и любую неверную интерпретацию, скажу, что этот скрипт стал возможен после публикования вопроса и первых комментариев к этому посту. Пруф https://code.google.com/p/google-apps-script-issue...
    Ответ написан
    Комментировать
  • Система бронирования (резервирования) товаров (заказов) Google spread sheet. Примеры?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Здравствуйте.

    Вот небольшой пример https://youtu.be/9WK1FM2_tDc Таблица https://goo.gl/4u23t7 (необходимо сделать копию)

    Суть в том, чтобы вести запись только в одном листе "История". На "Складе" остатки отображаются через формулу:
    =QUERY('История'!B:E;"select B, C, sum(D) where E=true group by B, C")

    Т.е. если в "Истории" будет запись без TRUE, то ее можно считать "непроведенной".
    Лист "Заказы" служит пояснением для "Истории", возможно, надо как-то расширить связь этих Таблиц, но она все равно будет условной.

    Пояснения к коду. Серверная часть нуждается в LockService, чтобы разрешить очередь записи.
    Можно сделать форму просмотра заказов, с возможностью помечать FALSE в "Истории". Может быть даже "Редактировать", но лучше по-моему, делать копию и записывать новый заказ, помечая прежний как FALSE. Также необходимо продумать регламент, т.к. Таблицы "нерезиновые" и необходимо максимально часто переносить остатки.

    Пояснения к концепту. Ваше представление, которое приведено выше, вряд ли подойдет для реализации в Таблицах, уже только потому, что никаких идентификаторов строк, и тем более связей между Таблицами, не существует. Я предлагаю вообще ничего не удалять. Лучше делать "перенос остатков" и прочих параметров в новые Таблицы (или наоборот), чтобы иметь более полноценную картину действий.

    Пожалуйста, измените теги в топике на Google script и Spreadsheets. При текущем теге ответ на вопрос должен быть примерно таким https://www.google.com/enterprise/marketplace/sear...
    Ответ написан
  • Как построить диаграмму (график) для не смежных ячеек в Google таблицах?

    oshliaer
    @oshliaer
    Google Products Expert
    Здравствуйте.

    Используйте раздел "Функции" основной "Настройки" - опция "показывать 0"
    20de821d52bd49be80aa41f6a4e164ad.gif

    Пожалуйста, присылайте ссылки на примеры goo.gl/ZLO06Q, иначе, не всегда просто понять, что вы желаете получить. Примечательно, что Таблицы не занимают места на Диске Google.
    Ответ написан
    4 комментария
  • Как получить доступ к таблицам google spreadsheets?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Пример, как это можно решить через Google Apps Script. В качестве получателя XMLHttpRequest.

    Суть способа в опубликованном файле скрипта Как получить доступ к таблицам google spreadsheets?. Он

    1. Получает запрос POST
    2. Берет данные из Таблицы, владельцем которой является другой пользователь. Уровень доступа "Для всех в Интернет".
    3. Возвращает ответ.


    Хостинг страниц на Диске Google больше не работает. Необходимо загрузить страницу на свой хостинг.
    Ответ написан
    2 комментария