Задать вопрос
Ответы пользователя по тегу Google Sheets
  • Как правильно писать регулярные выражения в google sheets?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Возможно, что нужно указать флаги в регулярном выражении (gmi). Если нет g флага, .match() возвращает только первое совпадение в виде массива, в котором совпадение находится по индексу 0.
    Ответ написан
    Комментировать
  • Можно ли в query использовать ссылку на ячейку?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Используйте ДВССЫЛ(), он же INDIRECT()
    =ДВССЫЛ("workdays_"&A1)
    Ответ написан
    1 комментарий
  • Как импортировать информацию с Google.Maps в Google Sheets?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Если получить данные по этому url, то видно, что изначально там информации нет, т.е. все полезные данные подгружаются JavaScript'ом. Если выкинуть всё лишнее, скрипты и стили, то возвращается такой код:
    <!DOCTYPE html>
    <html itemscope="" itemtype="http://schema.org/Place" lang="en">
    
    <head>
        <title> Google Maps </title>
    </head>
    
    <body class="keynav-mode-off" tabindex="-1">
        <noscript>
            <div id="no-script">
                <div class="no-script-message">
                    <div> When you have eliminated the <strong>JavaScript</strong>, whatever remains must be an empty page. </div> <a class="no-script-help-link" href="//support.google.com/maps/?hl=en&amp;authuser=0&amp;p=no_javascript" target="_blank"> Enable JavaScript to see Google Maps. </a>
                </div>
            </div>
        </noscript> 
    </body>
    
    </html>
    Ответ написан
    Комментировать
  • Есть ли вариант кода без кода table?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Используйте IMPORTXML(), там есть XPATH, которым можно выудить любой элемент или группу элементов по любому условию.
    Ответ написан
  • Есть ли способ выгрузить данные из листа Google таблиц и выдать их с учетом того, кто их запрашивает?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    1) На каждую выгрузку сделать скрытый лист, и фильтровать туда формулой с FILTER() или QUERY(). 1лист=1пользователь
    2) Сделать Файл - Публикация в интернете для каждого технического листа - и раздать ссылки каждому пользователю.
    Ответ написан
    Комментировать
  • Как вместо формулы вставить строку в ячейку Google sheet?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Вместо
    cell.setFormula('=A1000+B1000 '+ str);
    пишите
    cell.setValue('=A1000+B1000 '+ str);
    Это как раз не применение формулы, а "просто строка", а точнее - значение.
    Ответ написан
    Комментировать
  • Как отправлять письма из google таблицы?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    1) Получить данные из нужного диапазона
    var inData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1").getRange("A1:C").getValues();

    2) Отфильтровать по нужному email (для надёжности я тут бы ещё всё к нижнему регистру привёл)
    inData = inData.filter(row=>row[2]==="example@site.com");

    3) Собрать из остатков массива письмо и отправить с помощью MailApp.sendEmail(recipient, subject, body)
    Ответ написан
    Комментировать
  • Как составить формулу для суммирования столбца над ячейкой?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Вот так:
    =СУММ(ДВССЫЛ("R2C[0]:R[-1]C";0))
    Ответ написан
    Комментировать
  • Как получить емэил, вносящего изменения в гугл таблицу?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Для простых триггеров наподобие onEdit и пользовательских функций недоступен объект user, в этом можно убедиться если сделать такой код:
    function onEdit(e) {
      SpreadsheetApp.getActiveRange().setValue(Utilities.formatString("email: %s",e.user.getEmail() ));
    }

    Но никто не запрещает сделать другую функцию и назначить ей триггер "При изменении" (Изменить - Триггеры текущего проекта - Добавление триггера - onEditTrigger - Основное развертывание - Из таблицы - При редактировании - Сохранить):
    function onEditTrigger(event) {
            var userEmail = event.user.getEmail();                  //Email пользователя
    	//Что-то делаем...
    };
    Ответ написан
  • Возможно использовать значение ячейки как ссылку на другую ячейку?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Если нужно скопировать значение из C4, то
    =C4
    Если нужно скопировать значение по адресу, который лежит в A1, т.е. из "С4", то
    =ДВССЫЛ(A1)
    или
    =INDIRECT(A1)
    Ответ написан
    1 комментарий
  • Как полностью копировать ячейку с одного листа на другой?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Я бы сделал так:
    /**
     * Копирует значения и форматирование из fromRange в toRange
     *
     * @param {"A1:B10"} fromRange Исходный массив
     * @param {"D1:E10"} toRange Конечный массив
     * @return 0 если выполнилось без ошибок, или описание ошибки
     * @customfunction
     */
    function copyRange(fromRange, toRange){
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      try{
        var source = ss.getRange(fromRange);
        var dest   = ss.getRange(toRange);
        
        dest.setValues(source.getValues());
        dest.setBackgrounds(source.getBackgrounds());
        // и т.д. Есть много чего из форматирования, получается по get... ставится по set...
        
        return 0;//Завершение без ошибок
      }catch(err){
        Logger.log(Utilities.formatString((arguments.callee.toString().match(/function ([^(]*)\(/)[1]) + "(%s) - %s", Array.from(arguments).join(", "), err.message)); //Ошибку в лог
        return err.message;//Завершение с ошибкой
      };
    };

    Использовать так:
    function syncRanges(){
      copyRange("b7:b11", "c7:c11"); // b7:b11 >> c7:c11
      copyRange("f1:f20", "g1:g20"); // f1:f20 >> g1:g20
      //и т.п. можно вызывать несколько раз для разных диапазонов
    };

    И настроить для функции syncRanges() триггер "на изменение таблицы" или "по времени".
    Ответ написан
    Комментировать
  • Как использовать один проект Apps Script для 2х и более Таблиц?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Вместо обычного
    var ss = SpreadsheetApp.getActiveSpreadsheet();  //Текущая таблица

    используйте один из вариантов
    var ss = SpreadsheetApp.openById(id); //открытие сторонней таблицы по id
    //или
    var ss = SpreadsheetApp.openByUrl(url);//открытие сторонней таблицы по url

    И потом работайте с ss как с обычной таблицей
    Ответ написан
    1 комментарий
  • Как настроить градиент для графика сна в Google Sheets?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    1) Выделить ячейки
    2) Формат - Условное форматирование
    3) Выбрать "Своя формула"
    4)=И(ДВССЫЛ("RC";0)<>"";ДВССЫЛ("RC";0)>=(0/24);ДВССЫЛ("RC";0)<(5/24))
    5) Установить форматирование для этого диапазона (0-5 часов)
    6) Повторить 2) - 5) для остальных диапазонов
    Демонстрационная таблица
    Ответ написан
    Комментировать
  • Как сделать автозаполнение скриптом?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Многое можно сделать чисто формулами. Вот пример - если что-то есть в столбце A, то получается сумма (A + B). Запишите это в C1 и добавьте в A и B значения.
    =arrayFormula(
      еслиошибка(
         если(a:a<>""; a:a+b:b; "")
      )
    )


    Демонстрационная таблица
    Ответ написан
    Комментировать
  • Google Sheets Как ограничить триггер onEdit?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    В параметре e много полезного. Как раз по нему можно ограничить действие скрипта на какие-то листы или отдельные ячейки или по более сложным условиям.
    function onEdit(event) {
    	//Возникает при изменении ячейки
    	var ss = 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;							//Старое значение
    	
      if (["Лист1","Лист2"].indexOf(ss.getName())==-1) return;	//Указываем на каких листах должен работать скрипт
    	
    	//Что-то делаем...
      };
    Ответ написан
    Комментировать
  • Как в Гугл таблицах разбить текст по жирности?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Нужно использовать скрипт, в нём смотреть getRichTextValue()

    /**
     * Аналог функции split. Разбивает по наличию жирности у текста
     * [ ProgrammerForever (c) 2020 ]
     * @param {"A1"} rangeName Имя ячейки
     * @return Возвращает массив строк с чередующейся жирностью
     * @customfunction
     */
    function splitByBold(rangeName) { 
      if (!rangeName) {
        throw "Параметр rangeName не задан. Должен быть адресом ячейки"
      };
      
      var rtv = SpreadsheetApp.getActiveSheet().getRange(rangeName).getRichTextValue();
      
      if (rtv) {
        rtv=rtv.getRuns()
      }else{
        return SpreadsheetApp.getActiveRange().getValue();
      };  
      
      var outData = [rtv[0].getText()];
      var isBold = rtv[0].getTextStyle().isBold();
      var k=0;
      for (var i = 1; i < rtv.length; i++){
        if (rtv[i].getTextStyle().isBold() === isBold){
          outData[k]+= rtv[i].getText();
        }else{
          k+=1;
          outData[k]= rtv[i].getText();
          isBold = rtv[i].getTextStyle().isBold();
        };
      };
      return outData;
    }

    Демонстрационная таблица
    Ответ написан
    Комментировать
  • Google таблицы, заполнение одного листа инфой из другого?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Всё просто. Берем столбец с клиентами
    A:A
    Берем столбец со статусами
    B:B
    Заменяем клиентов на пустые значения, если договора нет, используем "массовую" формулу ArrayFormula()
    ArrayFormula(ЕСЛИ(B:B="Заключен";A:A;""))
    Что получилось - разворачиваем на 90 градусов функцией ТРАНСП()
    =ТРАНСП(ArrayFormula(ЕСЛИ(B:B="Заключен";A:A;"")))
    Можно изначально отфильтровать пустые строки, тогда получится так:
    Таблица демонстрационная
    Финт с превращением в пустые значения нужен чтобы данные не съехали, если изменится статус у клиентов.
    Ответ написан
    Комментировать
  • Как можно выводить изменения ячейки в гугл таблицах?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Нужно отслеживать событие onEdit(event) и писать лог в нужный лист.
    function onEdit(event) {
      //Возникает при изменении ячейки
      var ss = 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;        //Старое значение
      
      if (["Лист1","Лист2"].indexOf(ss.getName())==-1) return;	//Указываем на каких листах должен работать скрипт
      //Можно при желании ещё фильтровать по строке/столбцу (row/col), или по старому/новому значению (oldValue/newValue)
      
      var archive = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Архив");
    
      archive.getRange(archive.getLastRow()+1, 1).setValue(
        formatDateTime(new Date())+" " + "[" + ss.getName() + "!" + address + "] '" + (oldValue==undefined?"":oldValue) + "' >> '" + (newValue==undefined?"":newValue) +"'"
      );
    };
    
    function formatDateTime(date) {
    
      var dd = date.getDate();
      if (dd < 10) dd = '0' + dd;
      var mm = date.getMonth() + 1;
      if (mm < 10) mm = '0' + mm;
      var yy = date.getFullYear() % 100;
      if (yy < 10) yy = '0' + yy;
      
      var hh = date.getHours();
      if (hh < 10) hh = '0' + hh;
      var MM = date.getMinutes();
      if (MM < 10) MM = '0' + MM;
      var ss = date.getSeconds();
      if (ss < 10) ss = '0' + ss;
      
      return dd + '.' + mm + '.' + yy + ' ' + hh + ':'+ MM + ':'+ ss;
    }

    Вот ссылка на демо
    Ответ написан
    4 комментария
  • Как перенести данные из google forms в google sheets?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Это должно помочь. На строки в ДВССЫЛ() все трюки с автозаменами не распространяются.
    =arrayformula(ДВССЫЛ("'Ответы на форму (1)'!c1:c)"))
    Ответ написан
    Комментировать
  • Как отобразить только последний успешный результат IMPORTXML и игнорировать, если возвращается ошибка?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Тут только скрипт поможет. Складировать результаты запросов (дата или номер + данные) в отдельный диапазон скриптом (определить последнюю незаполненную строку, положить данные по таймеру), и оттуда брать последний по дате без ошибок функцией FILTER().
    Ответ написан
    Комментировать