Задать вопрос
  • Как использовать один проект 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;
    }

    Демонстрационная таблица
    Ответ написан
    Комментировать
  • Нет изображения на мониторе, в чем проблема?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Верно написали - промывать спиртом и сушить. Когда покажется что всё просохло - посушить ещё пару дней. Что греется можно попробовать перепаять. Там скорее всего будет безсвинцовый припой, поэтому нужно разбавлять его обычным ПОС-61 перед пайкой.
    Ответ написан
    Комментировать
  • Google таблицы, заполнение одного листа инфой из другого?

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

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Видимо, речь идёт о самоиндукции. Если провести аналогию с водой, то можно представить так: вода движется по трубе с большой скоростью (это ток). При этом давления в трубе нет или оно минимальное (это напряжение). Если резко закрыть путь воде (разорвать цепь), то разогнанной воде некуда деваться и она "утрамбовывается", создавая давление (поднимает напряжение).

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

    Всё происходит по принципу Ле Шателье - система выведенная из равновесия стремится к своему прежнему состоянию.
    Ответ написан
  • Как можно выводить изменения ячейки в гугл таблицах?

    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 комментария
  • Как выполнить скрипт на всех листах таблицы?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Можно получить список всех листов и проходить в цикле. Данные копировать так же, но при вставке менять номер строки (тут 2 заменить на (последнюю строку данных на листе + 1))
    .getRange(2, 1, FromData.length, FromData[0].length)

    Если хочется чтобы работало быстрее - то нужно формировать двумерный массив данных из всех, и потом за раз писать в ячейки. Просто при получении новой порции данных добавляйте построчно их в общий двумерный массив.
    Ещё проще - использовать IMPORTRANGE() - там само всё подтягивается с другой таблицы. Если надо писать в столбец, можно использовать декларацию массива:
    ={1;2;3}
    ... выведет 1,2,3 в столбик. Замените цифры формулами с IMPORTRANGE() по количеству листов и получите автоматически то что хотите. Единственное НО - данные такие - только на чтение
    Ответ написан
  • Как запустить скрипт в скрипте?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Просто вызывайте одну функцию из другой, даже если они в разных gs файлах
    //Code1.gs
    function f1(){
       return f2()+100;
    };
    
    
    //Code2.gs
    function f2(){
       return 200;
    };
    Ответ написан
    Комментировать
  • Питание магнитоллы 12в с разных БП?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Обычно можно, сейчас почти все блоки питания идут гальванически развязанными от сети. Второй БП, который подключается к красному проводу магнитолы (память) может быть очень маломощным. Там 100-200 миллиампер максимум, в режиме ожидания. Хотя при подключении в авто, например, нужно жёлтый провод включать в цепь зажигания, или зимой за пару-тройку дней аккумулятор средней паршивости высаживает так, что потом не завести. Земли (минус питания) соединить нужно, чтобы напряжения считались от одного уровня потенциала.
    Ответ написан
    1 комментарий
  • Как перенести данные из google forms в google sheets?

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

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

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Не совсем то, но думаю что поможет. Используейте FILTER(Диапазон;Условие1;Условие2;...УсловиеN) для подсчёта суммы.
    например, в вашем случае, в B47 пишем:
    =СУММ(FILTER($C$2:$C$45;$B$2:$B$45=A47))
    Где A47 - фильтр-условие на диаметр трубопровода
    А ещё лучше - сразу сделать так:
    =ЕСЛИОШИБКА(СУММ(FILTER($C$2:$C$45;$B$2:$B$45=A47));0)
    Ответ написан
    Комментировать
  • Как скопировать значение из ячейки, google sheets?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Если нужно зафиксировать курс на какой-то дате, используйте функцию GOOGLEFINANCE(код; [атрибут]; [дата_начала]; [дата_окончания|количество_дней]; [интервал])
    Информация о функции на русском
    Например, в A1 пишите так (вместо USD и RUB можно подставить любые другие валюты):
    =GoogleFinance("CURRENCY:USDRUB"; "close"; D2)
    В D2 пишите дату закупки. И курс валюты подтягивается с определенной даты. Т.к. это исторические данные, то они уже не поменяются.
    Ответ написан
  • Существует ли возможность связать GoogleSheets без improtrange?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Заверните IMPORTRANGE в FILTER(Данные;Условие1;Условие2...) по условию. Или попробуйте обработать скриптом данные.
    Вот такая штука может пригодиться(чтобы выбрать первые rows строк из данных), как-то сделал и теперь постоянно пользуюсь:
    /**
     * Возвращает rows строк и cols столбцов из array
     *
     * @param {A:A} array Исходный массив
     * @param {10} rows Количество строк. По умолчанию возвращаются все строки
     * @param {1} cols Количество столбцов. По умолчанию возвращаются все столбцы
     * @return Возвращает rows строк и cols столбцов из array
     * @customfunction
     */
    function take(array,rows,cols) {
      if (!array.map) {return array};
      var rows = rows||array.length;
      var cols = cols||array[0].length;
      
      if (array.length>rows) {array.length = rows};
      return array.map(
        function(row){
          return row.map?((row.length>cols)?row.splice(cols,row.length-cols):row):row;
        }
      );
    }
    Ответ написан
  • Как дописать скрипт Google Apps script?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Получать данные по одной ячейке - это ооооооочень долго. Лучше взять все данные сразу в нужном диапазоне, например так:
    var data = ss.getActiveSheet().getRange("A3:A1000").getValues();

    И потом можно обращаться к этим данным по номеру строки и номеру столбца, не забывая что отсчёт идёт с нуля:
    data[row][column]
    Записывать тоже нужно массово. В итоге получится что-то такое:
    function onOpen() { 
      //Выполняется при открытии
      SpreadsheetApp
      .getUi()
      .createMenu('Меню')
      .addItem('Выполнить','doIt')
      .addToUi();
    };
    
    function doIt() {
      try{
        var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); //Текущий лист
        
        var data1 = ss.getRange("A3:E" + ss.getMaxRows()).getValues();
        var data2 = ss
        .getRange("m4:n" + ss.getMaxRows())
        .getValues()
        .filter(function(row) // Убираем пустые строки
                {
                  return row[0]!="";
                }
               );
        
        for (var row2=0;row2<data2.length;row2++){
          for (var row1=0;row1<data1.length;row1++){
            if (data1[row1][0]===data2[row2][0]){
              data1[row1][4]+=data2[row2][1];
              break; //Если значение найдено, дальше не ищем
            };
          };
        };
        
        ss.getRange("A3:E" + ss.getMaxRows()).setValues(data1); //Вывод данных
        SpreadsheetApp.getActive().toast("Готово!");
      }catch(e){ //Если вдруг ошибка
        Logger.log("Ошибка! " + e);
      };
    }

    Демо-таблица
    Ответ написан
    6 комментариев
  • Как сравнить два числа в одной ячейке в Google Таблицы?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Используйте REGEXEXTRACT(текст;регулярка) для извлечения кусков текста, чтобы потом сравнить, например что первое меньше второго
    =REGEXEXTRACT(A1;"(\d)+\:") < REGEXEXTRACT(A1;"\:(\d)+")

    Чтобы подсветить соседнюю ячейку, можно использовать Формат - Условное форматирование
    Ответ написан
    1 комментарий
  • Как подсчитать количество импульсов за единицу времени?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Как вариант - измерять не частоту, а период следования импульсов. И считать по скользящему среднему за N щелчков. Фон будет считаться медленно, потому что щелчков мало, но если данных будет много - то показания будут изменяться быстрее. Но в любом случае, точность будет предсказуема и примерно одинакова на любой скорости щелчков.
    Ответ написан
    Комментировать