• 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 щелчков. Фон будет считаться медленно, потому что щелчков мало, но если данных будет много - то показания будут изменяться быстрее. Но в любом случае, точность будет предсказуема и примерно одинакова на любой скорости щелчков.
    Ответ написан
    Комментировать
  • Как инициализировать массив Point?

    ProgrammerForever
    @ProgrammerForever Автор вопроса
    Учитель, автоэлектрик, программист, музыкант
    Дело было не в бобине. Проблема была строкой выше, а отладчик подсвечивал именно этот кусок кода. Спасибо откликнувшимся!
    Ответ написан
  • Какой физический смысл импульса?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Как только всё уляжется в голове, советую прочитать про Оператор импульса. Когда придёт понимание что все величины и понятия, про которые мусолили годами в школе - всего лишь математика над волновой функцией - будет круто.
    Ответ написан
    Комментировать
  • Как избавиться от Loading?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Если данные сконцентрированы в каком-то месте, можно вместо пользовательской функции использовать просто функцию. Только добавить получение из таблицы аргументов, и вывод результата. Обновление можно повесить на открытие таблицы, на onEdit(event) или на триггер по времени, как нравится. Но такой способ менее информативный, на самом деле. Непонятно обновилось оно или нет. Обычно я в конце таких функций(если нет возможности сделать пользовательскую функцию) добавляю тост о том, что всё завершено.
    SpreadsheetApp.getActive().toast("Функция завершена");
    Ответ написан
    Комментировать
  • Как сделать очистку ячеек выбранного диапазона при активации другой?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Что значит "активная"? Нет события "активная ячейка" но есть событие "ячейка изменилась" - 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;	//Указываем на каких листах должен работать скрипт
    	
    	//Что-то делаем...
      };

    Вместо "Что-то делаем" впишите нужные действия, например, очистку диапазона. Код для очистки можно сделать макрорекордером Инструменты - Макросы - Записать макрос
    1) Запись
    2) Выделить диапазон
    3) Del
    4) Стоп записи
    Или использовать такой код:
    SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1").getRange("A2:B28").clear();

    Но тут есть момент - эта очистка на том же листе может снова спровоцировать onEdit() и надо с этим бороться, проверяя какой диапазон меняется перед тем как что-то очистить
    if (address !="B2") return;
    Ответ написан
    Комментировать
  • Как подтянуть информацию из нескольких листов в один?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Просто нужно указать ссылку на диапазон и обернуть его в ArrayFormula()
    =ArrayFormula(Лист1!A1:Z100)
    Если данные нужно выводить последовательно (например в первом листе 100 строк, во втором 150 и т.п.) а нужно чтобы шло сплошным массивом, то можно использовать декларацию массива, попутно отсеивая пустые строки (в данном случае - по первому столбцу)
    =Arrayformula(
    {
    filter(Лист1!1:200;Лист1!A1:A200<>"");
    filter(Лист2!1:200;Лист2!A1:A200<>"");
    filter(Лист3!1:200;Лист3!A1:A200<>"")
    }
    )

    Демонстрационная таблица
    Ответ написан
  • Гиперссылка Google Apps Script как IMPORTRANGE?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Оно и так сохраняется
    Демо-документ
    Ответ написан
    Комментировать