Задать вопрос
Ответы пользователя по тегу Google Sheets
  • Гугл формула игнорирует регистр, что делать?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Если данные не списочные, приводите их к одному виду.
    СТРОЧН() для текста, можно ещё СЖПРОБЕЛЫ() применить (получаем чистый текст)
    ОКРУГЛВНИЗ() для дат (получаем только дату, без времени)
    +() для чисел, чтобы не-числа стали числами
    и так далее
    Ответ написан
  • Как сохранять в гугл таблицу список значение ячейки, которое постоянно меняется?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Есть много способов. Например, в onEdit брать значение и сохранять в отдельном месте. Или вставлять строку.
    Ответ написан
    Комментировать
  • Как создавать только 1 документ при переносе данных из гугл таблиц?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    .makeCopy()
    В этом месте и создаётся файл.

    Чтобы он не создавался, добавьте проверку на существование. Что-то вроде:
    let fileName = 'Заявка № ' + number;
    if (!DriveApp.getFilesByName(fileName ).hasNext()){
      return;
    };
    Ответ написан
    Комментировать
  • Как дополнить формулу =QUERY на вывод кол-во уникальных значений с их подсчетом?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    3 раза примените формулу
    =let(
      calcCount; lambda(data; QUERY({data}; "
        SELECT Col1, COUNT(Col1)
          WHERE Col1 IS NOT NULL
          GROUP BY Col1
      "));
      HSTACK(calcCount(b4:b); calcCount(c4:c); calcCount(e4:e))
    )
    Ответ написан
    Комментировать
  • Как написать формулу чтоб из диапазона достать уникальные значения в один столбец?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    TOCOL делает столбец из данных.
    =QUERY(
      TOCOL(A:B);
      "SELECT Col1, COUNT(Col1)
        WHERE Col1 IS NOT NULL
        GROUP BY Col1
        ORDER BY COUNT(Col1) DESC
        LABEL Col1 'Кто', COUNT(Col1) 'Кол-во'
      "
    )
    Ответ написан
    4 комментария
  • Какую формулу можно использовать для переноса данных диапазона в рамках одного листа?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    =ArrayFormula(A1:C10)
    A1:C10 - что копируем
    ввести формулу в левую верхнюю ячейку куда копируем
    Ответ написан
    Комментировать
  • Как настроить "автоматически расширяемый" диапазон в условном форматировании?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    При вставке строк, удалении строк, копировании ячеек, добавлении строк через "Вставить строки ниже" в уже готовом правиле автоматически меняется диапазон - автоматом расширяется и сжимается исходя из логики изменений структуры. Причем если было A1:A10, например, то при добавлении строки в 5 позиции будет A1:A11 в итоге.
    Я бы сказал, что это не баг, а фича. Отследите после чего появляются дефрагментированные диапазоны и не делайте так.
    На крайний случай - сделайте скрипт который будет обновлять условное форматирование.
    Ответ написан
    Комментировать
  • Как собрать данные с помощью Importxml?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Посмотрите что вообще сервер отдает. Возможно сайт грузится динамически. Вот мой старый код, должен помочь
    /**
    * Открывает URL и возвращает код страницы
    * Telegram - @ProgrammerForever
    *
    * @param {string} URL URL который нужно открыть
    * @param {boolean} isCut Указывакт, нужно ли обрезать страницу до 50000 символов по длине, по умолчанию false
    * @param {boolean} noScript Указывакт, нужно ли удалять скрипты из кода
    * @return Исходный код страницы
    * @customfunction
    */
    function getHTML(URL,isCut,noScript) {
      if ((URL === undefined)||(URL == "")) { return "#ОШИБКА Пустой URL";};
      if (isCut === undefined) {var isCut=true;};
      if (noScript === undefined) {var noScript=true;};
      if (URL.map){     //Если задан диапазон
        return URL.map(getHTML);
      }else{
        try {
          var payload = {
            'rand':(new Date()).getTime()
          };
          var headers={
            'Connection': 'keep-alive',
            'Cache-Control': 'max-age=0',
            'Upgrade-Insecure-Requests': 1,
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7'
          };
          var options = {
            'method' : 'get',
            'headers' : headers,
            'payload': payload
          };
          
          var response = UrlFetchApp.fetch(URL,options);
          var charset=response.getAllHeaders["charset"];
          //var responseText=response.getContentText(charset?charset:"windows-1251");
          var responseText=response.getContentText(charset?charset:"UTF-8");
          if (noScript){ 
            responseText=responseText.replace(/<script[^>]*>(?:(?!<\/script>)[^])*<\/script>/gmi,"");
            responseText=responseText.replace(/<!--.*?-->/gmi,"");
            responseText=responseText.replace(/<link.*?\/>/gmi,"");
            responseText=responseText.replace(/<meta.*?\/>/gmi,"");
            responseText=responseText.replace(/[\n\r\t]/gmi,"");
            
          };
          if (isCut&&(responseText.length>50000)){return responseText.substring(0,50000);}else{return responseText;};
        } catch (err) {
          //return JSON.stringify(err);
          return "#ОШИБКА "+err.message;
        };
      };
    };
    Ответ написан
  • Как программно написать триггер, который будет запускать макрос, при условии редактирования определенной ячейки на определенном листе?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Только я раз 10 этот код скидывал здесь.
    /**
     * Возникает при изменении ячейки
    * @param {e} event event-объект https://developers.google.com/apps-script/guides/triggers/events?hl=ru
     * [ ProgrammerForever (c) 2020 ]
     * @return Не возвращает значений
     */
    function onEdit(event) {
      var sheet = event.source.getActiveSheet();//Текущий лист
      var address = event.range.getA1Notation().toUpperCase();//Адрес ячейки
      var row = event.range.getRow();      //Номер строки
      var col = event.range.getColumn();  //Номер столбца
      var newValue = event.value;            //Новое значение
      var oldValue = event.oldValue;        //Старое значение
      var userEmail = event.user.getEmail();//Пользователь(работает только при вручную назначенном триггере)
      
      if((col===1)&&(row===1)&&(sheet.getName==="Sheet1")){
        // Что-то делаем
      };
    };
    Ответ написан
    Комментировать
  • Можно ли задать счетчик, где условием является ссылка на ячейку?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Получать формулы, парсить и надеяться что там нет INDIRECT()/пользовательских функций/именованных диапазонов и т.п.
    В чём вообще исходная задача? Я такое делал когда в таблице на 100к формул появился цикл, пришлось писать скрипт который строит граф связей по ячейкам.
    Ответ написан
  • Как сделать нужные строки по фильтрам с отображением на новом листе?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Храните данные и правьте в 1/2. Смотрите фильтр в 3. Так можно обойтись только формулой FILTER.
    Если править и в 1/2 и в 3 - то делаете скрипт с функцией onEdit(event) которая будет таскать записи с 3 на 1/2.
    Ответ написан
    Комментировать
  • Почему выдает ошибку Service Spreadsheets failed while accessing document with id sheet_id?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    1) Вынесете лист с которым работаете в отдельную переменную вне цикла, нет необходимости получать её каждый раз.
    2) Зачем нужен массив abc? item никак не используется.
    3) Сделайте задержку или SpreadsheetApp.Flush(). Скорее всего не успевает скрипт.
    4) Объединённые ячейки - зло и грабли.
    Ответ написан
    Комментировать
  • Как в итоговую таблицу импортировать данные только из определенной таблицы из предложенного списка таблиц?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    соответствующей = ВПР()
    выгружаться = IMPORTRANGE()
    Заведите справочник, ищите по нему id таблицы. Это первый аргумент в IMPORTRANGE(). Второй - это имя_листа + диапазон
    =IMPORTRANGE(ВПР(город;{ВсеГорода\ВсеID};2;0);"Данные!A1")

    город = ссылка на ячейку выбора города
    ВсеГорода - столбец с данными по названиям городов
    ВсеID- столбец с данными по id таблиц
    Данные!A1 - что нужно импортировать
    Ответ написан
    Комментировать
  • Как настроить проставление даты при изменении соседней ячейки в Google Sheets?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Чтобы дата не менялась, нужно копировать данные скриптом и фиксировать дату копирования.
    1) Получить все данные из источника
    2) Убрать все строки (по какому-то ключевому столбцу) которые уже есть в приёмнике
    3) Добавить дату копирования в каждую из оставшихся после фильтра строк
    4) Добавить эти данные в приёмнике
    Ответ написан
  • Как зафиксировать строку в Таблице, которая выводится через iframe?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Не могу утверждать, но скорее всего - никак. Или грузить только данные и рисовать таблицу самому.
    Как-то делал "бекенд табличный", заказчик как раз для сайта его использовал своего.
    Делайте doGet() функцию, в ней передача всей таблицы как json. А на стороне сайта получайте то и отрисовывайте таблицу с любым функционалом.
    Ответ написан
    Комментировать
  • Как учитывать рабочее время?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    4 часа в Excel/GSheets это:
    =ваша_дата + 4/24
    Если время работы в пределах 1 рабочего дня, то проверяйте какой час выходит при суммировании. Если больше порога - то ставите верхний порог, а следующая дата - начиная с нижнего порога плюс остаток.
    Что-то вроде:
    =ЕСЛИ(ОСТАТ((A1+B1/24);1)>=18/24; ЦЕЛОЕ(A1) + 18/24; A1+B1/24)

    А если по сути - тут можно порыть в сторону систем счисления и простых линейных уравнений.
    Или сделать ещё проще - с помощью юзерфункции.
    Ответ написан
  • Почему не удается получить данные методом video.get у некоторых ссылок?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    1) Попробуйте открывать не в браузере, а в постмане; там более чистый запрос - нет кук, можно контролировать заголовки, юзер-агент, реферер и т.п.
    2) Если приходит ответ вида:
    {"response":{"count":0,"items":[]}}
    то, скорее всего, и с токеном и со всем остальным всё ок - что-то не то с данными запроса или с самим ресурсом, который запрашивается. Это 200 ответ, а не ошибка.
    3) Как вариант для проверки - сервис может не отдавать данные по некоторым ip адресам. Предсказать какой будет ip у скрипта невозможно.
    4) Попробуйте сохранить и переиспользовать куки, внедрить в headers нужные заголовки, которые браузер передаёт и т.п.
    5) Перезалейте второе видео, возможно всё-таки есть что-то, что запрещает получать данные по API.
    Ответ написан
    Комментировать
  • Гугл таблицы. Как зафиксировать гиперлинк на конкетруную строку?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Добавьте параметр range к ссылке. Там есть номер строки:
    ...edit?gid=0#gid=0&range=A7
    Ответ написан
  • Как сделать секундомер с пуском и паузой?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Для каждого ввести статусы - выключено, запущено; т.е. нужна простая машина состояний.
    Кнопки меняют статусы и пишут данные. Вместо кнопок можно onEdit+галка.
    Триггер по времени (раз в минуту) обновляет данные.

    Если нужно готовое решение - можно посмотреть в сторону фриланса
    Ответ написан
    Комментировать
  • Почему не работает тригер гугл таблиц?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Тут в самом вопросе ответ:
    через бота >> не работает
    через apps scripts >> не работает
    вручную >> работает

    Если надо запустить функцию извне, используйте doGet/doPost
    Ответ написан
    Комментировать