Задать вопрос
  • Как изменить язык в Google Apps Script?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    5c0ffc9a09bee441507346.png
    Ответ написан
    Комментировать
  • Почему неправильно рассчитывается дата?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Ответ на этот вопрос дан на ruSO https://ru.stackoverflow.com/q/882107

    Основная идея в том, чтобы использовать базовые единицы расчета дат (миллисекунды), а не их производные (дни, часы, минуты).

    Хотелось бы добавить, что
    >  new String('Hello world!') == 'Hello world!'
    <· true
    >  new String('Hello world!') === 'Hello world!'
    <· false

    И в данном контексте создание объекта строки неуместно.
    Ответ написан
    Комментировать
  • Как получить значения всех ячеек в колонке?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    /**
     * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet Лист Таблицы
     * @param {number} column Номер столбца
     * @param {number} [startRow] Пропускает количество строк сначала
     * @param {number} [numColums] Количество возвращаемых колонок
     * @returns {Object[][]} Массив значений
     * @see {@link https://toster.ru/q/549725}
     */
    var getValuesFromColumn = function(sheet, column, startRow, numColums) {
        startRow = startRow || 1;
        numColums = numColums || 1;
        var lastRow = sheet.getLastRow();
        return sheet
            .getRange(startRow, column, lastRow - startRow + 1, numColums)
            .getValues();
    };
    
    var arr = getValuesFromColumn(mainSheet, 3, 3, 2);
    Ответ написан
    Комментировать
  • Есть ли языки для описания технического задания по формирования сложных отчетов в табличной форме?

    oshliaer
    @oshliaer
    Google Products Expert
    Странное задание. Кажется немного неправдоподобным.

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

    # Контроль версий

    Всеволод Владимиров обязательно обратил бы внимание на последнюю фразу "уходит уйма времени на его изучение, трудно понять, что изменилось, что добавили". С большой вероятностью, у вас проблемы с таск/баг трекером. Его нет. Как нет и системы хранения заданий и версионирования решений. Следовательно, вы не можете проследить историю изменений и основные конструкционные нагрузки на формальные структуры и применяемые алгоритмы. Из этого следует, что при описании никто особо не использует

    # Структуры данных

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

    # Алгоритмы

    Чего проще, указать на схеме "срез последних"? Никогда не было остатков на "конец периода"? Уникальные. Поиск дубликатов. Поиск первого вхождения. Сортировка.

    # Классификация

    Необходимо постоянно производить классификацию отчетов и их структуризацию с применением хотя бы базовых таксономических принципов. Структуры и иерархии позволяют быстро производить поиск подобных, что в общем может само по себе уже являться решением проблемы, т.к. заменить условие не тоже самое, что создать запрос к БД заново.

    # Увеличения уровня абстракции

    После каждого (или каждой группы) цикла разработки отчета было бы не плохо увеличивать (стараться это делать) уровень абстракции описания проблемы. Ведь в конечном счете ваша цель в автоматизации. А что может быть приятнее, чем точный ответ на запрос: "Выгрузи самых активных клиентов каждого первого квартала за 10 лет".

    Получается, что лучший инструмент, опять карандаш.
    Ответ написан
    Комментировать
  • Google api: как прикрепить к письму файл из google-drive?

    oshliaer
    @oshliaer
    Google Products Expert
    Достаточно добавить ссылку на файл.

    from __future__ import print_function
    from googleapiclient.discovery import build
    from httplib2 import Http
    from oauth2client import file, client, tools
    from qs import CreateMessage, SendMessage
    
    SCOPES = 'https://www.googleapis.com/auth/gmail.send'
    
    def main():
        """Shows basic usage of the Gmail API.
        Lists the user's Gmail labels.
        """
        store = file.Storage('token.json')
        creds = store.get()
        if not creds or creds.invalid:
            flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
            creds = tools.run_flow(flow, store)
        service = build('gmail', 'v1', http=creds.authorize(Http()))
    
        message = CreateMessage('xxx@gmail.com',
                                'yyy@inbox.ru',
                                'test',
                                'https://docs.google.com/spreadsheets/d/xxx/edit?usp=sharing')
        SendMessage(service, 'me', message=message)
    
    if __name__ == '__main__':
        main()


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

    oshliaer
    @oshliaer
    Google Products Expert
    Ознакомьтесь со следующей справочной информацией.
    Как сменить владельца файла или папки
    Как освободить или увеличить хранилище Google Диска

    Из нее следует, что передать права вы сможете только на файлы поддерживаемых форматов, т.н. "файлы формата Диска Гугл".
    Самый простой способ - это поместить все файлы в одну папку, выделить их и сменить владельца, при этом в текущем выделении не должно быть файлов других форматов и фалов не принадлежащих вам.

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

    Очень станно слышать, что организация использовала систему общего доступа без контроля прав. Это серьезное упущение.
    Ответ написан
    Комментировать
  • Как можно с помощью google apps script найти все ссылки в google document?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Основной принциип поиска ссылок и базовый код может быть таким
    /**
     * Get an array of all LinkUrls in the document. The function is
     * recursive, and if no element is provided, it will default to
     * the active document's Body element.
     *
     * @param {Element} element The document element to operate on. 
     * .
     * @returns {Array}         Array of objects, vis
     *                              {element,
     *                               startOffset,
     *                               endOffsetInclusive, 
     *                               url}
     */
    function getAllLinks(element) {
      var links = [];
      element = element || DocumentApp.getActiveDocument().getBody();
    
      if (element.getType() === DocumentApp.ElementType.TEXT) {
        var textObj = element.editAsText();
        var text = element.getText();
        var inUrl = false;
        for (var ch=0; ch < text.length; ch++) {
          var url = textObj.getLinkUrl(ch);
          if (url != null) {
            if (!inUrl) {
              // We are now!
              inUrl = true;
              var curUrl = {};
              curUrl.element = element;
              curUrl.url = String( url ); // grab a copy
              curUrl.startOffset = ch;
            }
            else {
              curUrl.endOffsetInclusive = ch;
            }          
          }
          else {
            if (inUrl) {
              // Not any more, we're not.
              inUrl = false;
              links.push(curUrl);  // add to links
              curUrl = {};
            }
          }
        }
      }
      else {
        var numChildren = element.getNumChildren();
        for (var i=0; i<numChildren; i++) {
          links = links.concat(getAllLinks(element.getChild(i)));
        }
      }
    
      return links;
    }


    Источник Get All Links in a Document
    Ответ написан
    Комментировать
  • Работа с Google docs и Google Forms?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Никак. Попрбуйте общие вопросы вынести в новый раздел. Попробуйте ветвление Формы. Например, если пользователь выбрал из списка требуемое значение, то он уже не будет заполнять следующий раздел.
    Ответ написан
    Комментировать
  • Как связать существующий лист и Google форму?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Хороший и всех беспокоящий вопрос. Короткий ответ: "Никак".

    Этого невозможно сделать, т.к. первоисточником является Форма, а не Таблица. В вашем случае, просто получайте данные в новый лист, а форматирование скопируйте инструментом, обозначенным как валик.
    Ответ написан
    1 комментарий
  • Партнер в google forms вводит реквизиты и получает счет в excell. Как?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Вам придется программировать.

    Базовая идея заключается в том, что пользователь отправляет Google Форму с некоторым необходимым количеством идентификационных данных. В системе Диска инициируется событие, которое называется "Отправка Формы". Это событие можно перехватить с помощью приложения Google Apps Script. Дальше как ваша фантазия пожелает. Следующие сценари могут быть реализованы:
    • Отправляется только идентификатор, на почту отправляется счет на сумму остаттка(аванса)
    • Отправляются реквизиты, по которым находится почка, на которую отправляется счет на сумму остаттка(аванса)
    • Предыдущие пункты расширяются за счет отправки суммы счета
    Ответ написан
    Комментировать
  • Как загружать последнюю версию таблицы Google Spreadsheet?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    SpreasheetApp.flush();
    Ответ написан
    Комментировать
  • Googlee docs - как можно добавить свою кнопку для обертки определенного текста HTML тегами?

    oshliaer
    @oshliaer
    Google Products Expert
    Идея неплохая, но пока невыполнимая. Максимум, что вы можете сделать, это добавлять комментарии, но поиск по ним происходит невсегда, если вообще происходит.
    По большому счету, вы ожидаете некоторый слой метеданных над тектом Документов Гугл. Таких возможностей пока нет.

    Попробуйте отправить передложение по улучшению продкута https://gdriveru.blogspot.se/2017/04/reportproblen...
    Ответ написан
    Комментировать
  • Как получить названия папок(путь) что хранят файл?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Абсолютно бесполезное занятие, которое требует больших ресурсов. Плюс, на Диске могут быть папки в папках своих папок. Как вам такой поворот?

    Решение доступно в этом топике How do I locate the path of the folder in which th...
    Ответ написан
    Комментировать
  • Как сделать что бы при ставке чисел убирались лишние символы в гугл док?

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

    Пример работы дополнения.
    Пользователь открывает боковое меню, которое остается открытым весь период работы
    5aba02ef6e9b3253891467.png

    Добавляет значение из буфера в верхнее поле, получает результат в нижнем поле. Возможно заполнение буфера новым значением автоматически
    5aba03516b237273893919.png
    Ответ написан
    Комментировать
  • Превышено максимальное время выполнения Google Script, как решить?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Ваш же вопрос тут Максимальное время выполнения скрипта Google Script

    К тому же не ведете переписку по другим вопросам.

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

    if (continuationToken == null) {
      var files = DriveApp.getFiles();
    } else {
      var files = DriveApp.continueFileIterator(continuationToken);
    }
    где continuationToken заранее получен и извлечен из внешнего хранилища.
    
    if(files.hasNext()){
      var continuationToken = files.getContinuationToken();

    Для автоматического перезапуска скрипта вы должны создавать триггеры времени.

    Чтобы представить всю масштабность задачи, можете взглянуть на готовое приложение для копирования Диска ericyd/gdrive-copy

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

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

    Но у вас нет причин искать вызова триггера при таких условиях. Что-то же меняет это значение? Подпишитесь на изменение этого "что-то же" или дублируйте их.
    Ответ написан
    Комментировать
  • Как реализовать принцип сбора данных Google Forms для Google Sheets?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    sashka_shishka, внимательно прочитайте свой вопрос "... будут отправлять свои заказы в сборную таблицу и ... не будут иметь доступа к ней ..." и попробуйте справиться с противоречиями самостоятельно.

    Отправляя Форму, Респондент передает право Владельцу обработать его данные. Никакого форсированного внесения данные не происходит.

    К сожалению, общее (большинства) представление о доступе к Диску и его файлам очень сильно отличается от реальности. Ваша идея штатными средствами Диска недостижима. Есть возможность создания веб-приложения на базе Google Apps Script, которое будет "так" делать.

    Другим вариантом можно потратиться на GSuite Business и сделать форму в App Maker

    Вы пробовали IMPORTRANGE, импортируя данные из частных Таблиц в сводную.
    Ответ написан
    Комментировать
  • Как в запросе с Group By найти значения столбца в строках по которым не делается группировка?

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

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Как вариант, использовать Google Apps Script

    Берем набор слов
    5ab5543fa709d979929499.png

    Колдуем
    5ab5549085e47511989329.png

    Получаем
    5ab5549c9df60121044185.png

    =====================================================

    Пример для копирования

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

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Попробуйте проверку данных (Данные дальше > Проверка данных)

    Основная формула =COUNTIF($A:$A;"="&A1) < 2

    Пример настройки
    5ab52e8aaffa2151314854.png

    Сообщение, если введеные повторяющиеся данные
    5ab52eaa2dbe5113291625.png

    Пример Таблицы Как запретить ввод одинакового текста в гугл док? ...
    Ответ написан
    3 комментария