• Как разложить кол-во точек по окружности?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Если нужно именно точки по окружности размещать, то проще всего делать это в полярной системе координат. Формулы для пересчёта такие:
    x = R*cos(phi) + x0
    y = R*sin(phi) + y0

    ,где R - радиус окружности, phi - угол поворота от оси x против часовой стрелки, центр окружности находится в точке M(x0, y0). Соответственно если нужно N точек, то
    phi = (0,1,2...N-1)*(2*pi/N)
    Ответ написан
    2 комментария
  • Возможно использовать значение ячейки как ссылку на другую ячейку?

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

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Большого выигрыша не получить. 62 и 256 - это соответственно 6 и 8 бит, т.е. экономия максимум 25%.
    Как преобразовать, есть несколько вариантов:
    1) преобразовать каждый символ в строке в бинарный код по 6 бит, дополнить общую результирующую строку до длины кратной 8, преобразовать 8ки бит в символы.
    2) Составить таблицу по 4 символа base62, которым будет однозначно соответствовать 3 символа base256. Дополнять строку до длины кратной 4 символам, брать по 4 символа и из таблицы им будет соответствовать 3 символа base256
    Это классическая задачка по информатике на изменение системы счисления с 8 на 16 или 8 в 2, например, без другой промежуточной.
    Общее правило, которое я ещё в школе придумал для себя: если a,b - системы счисления и если a^N = b^M, то каждые N символов в системе a заменяется на M символов в системе b.
    Например:
    перевести 10101010101010101010101 из двоичной в 8ричную систему: [2^3 = 8^1]
    (0)10 101 010 101 010 101 010 101 (_2) = 25252525 (_8)
    перевести 102301023001230 из 4й в 8ричную систему: [4^3 = 8^2]
    102 301 023 001 230 (_4) = 22 61 13 01 54 (_8)
    Ответ написан
  • Посчитать сумму в ячейках, если в каждой ячейке несколько значений?

    ProgrammerForever
    @ProgrammerForever Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    В Google Spreadsheets это можно решить так:
    =СУММ(SPLIT(A1;"+"))
    Возможно что в Office 365 есть такие же функции.
    Как вариант, использовать пользовательскую функцию. Для Excel/VBA это будет обёртка вокруг Application.Evaluate()
    Ответ написан
    Комментировать
  • Зачем в этой функции сдвиг?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    1) ([1e7]+-1e3+-4e3+-8e3+-1e11) - формируется строка "10000000-1000-4000-8000-100000000000"
    2) .replace(/[018]/g,c= - пробегаемся по символам, и с каждым 0, 1 и 8 делаем что-то
    3) 15 >> c/4 - 0,1,8 => 15,15,3
    4) crypto.getRandomValues(new Uint8Array(1))[0] - случайное число 0..255
    5) crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4 - побитовое И сужает 0..255 до 0..15 или 0..3 (если с=8)
    6) c^crypto.getRandomValues(new Uint8Array(1))[0]&15 >> c/4 - 0 или 1 или 8 XORятся с 5)
    7) Что получилось - переводится в HEX и возвращается вместо символа

    Сдвиг и XOR ( 3) и 6) ) вероятно нужны для большей энтропии, хотя работает и без этого.
    Ответ написан
    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() триггер "на изменение таблицы" или "по времени".
    Ответ написан
    Комментировать
  • Как правильно составить план изучения микроконтроллеров для новичка?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Из всех ресурсов, которые мне попадались, могу 100% посоветовать два:
    1) easyelectronics.ru закроет многие вопросы по электронике и микроконтроллерам. Есть сообщество we.easyelectronics.ru в котором попадаются годные статьи
    2) Narod Stream на Youtube и есть отдельный сайт. Мужик снимает очень годные видео по программированию микроконтроллеров. На Си, на ассемблере. PIC, AVR, STM32, ESP и т.п.
    Ответ написан
    Комментировать
  • Как использовать один проект 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)"))
    Ответ написан
    Комментировать