Задать вопрос
  • При клике на один элемент кликнуть другой?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    $(".ten").on("click", ()=>$(".six").click());
    Ответ написан
  • Изменение, создание гугл документа через apps script в гугл таблицах?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Начните с...
    let doc = DocumentApp.openById(docId);
    Остальное интуитивно понятно. Ну или читайте соответствующую документацию
    Ответ написан
  • Как сделать так, чтобы данные из ячейки падали в сумму?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    При интенсивном вводе часть событий onEdit может пропускаться. Если это просто индикатор "плюс-минус-лапоть", то можно так и сделать. Иначе можно просто потерять часть данных. Лучшее решение: всё-таки держать реестр операций; таблица может содержать миллионы ячеек, да и лист можно скрыть с глаз, если мешает.
    Заготовка кода для onEdit() триггера

    /**
     * Возникает при изменении ячейки
    * @param {e} event event-объект https://developers.google.com/apps-script/guides/triggers/events?hl=ru
     * [ ProgrammerForever (c) 2020 ]
     * @return Не возвращает значений
     */
    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;        //Старое значение
      var userEmail = event.user.getEmail();//Пользователь(работает только при вручную назначенном триггере)
      
      //Делаем что-то
    };

    Ответ написан
    Комментировать
  • Результаты promise валятся в кучу, как исправить?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Добавьте параметр порядковый (номер запроса, timestamp, и т.п.) или определяйте по косвенным признакам (например - длина запроса, хотя при удалении текста будет коллизия). И если уже был обработан запрос N, то все запросы с меньшим порядковым номером - игнорируются как неактуальные
    Ответ написан
  • Получение url google папки в exel или libreOffice?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Используйте Google Drive API
    Ответ написан
    Комментировать
  • Как сделать Сокращение Полного Фио до первых букв на языке VBA?

    ProgrammerForever
    @ProgrammerForever Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    Function ShortName(fullName As String) As String
      Dim arrNames As Variant
      arrNames = Split(fullName)
      ShortName = arrNames(0) & " " & Left(arrNames(1), 1) & "." & Left(arrNames(2), 1) & "."
    End Function
    Ответ написан
    3 комментария
  • Google apps script Exception: Address unavailable?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    WB блокирует IP гугла. Но это не точно, читал мельком недавно в профильных чатах.
    Ответ написан
    Комментировать
  • Как с помощью importxml узнать, что объявление на авито снято с продажи?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Сайты подобной тематики и сложности не очень-то и любят парсинг. Уверен, что данные получаются отдельным запросом. Отключите JS в браузере и проверьте что отдаёт страница. Или вместо запроса в IMPORTXML поставьте звёздочку - вывалится список всех нод. Или ещё вариант:
    /**
    * Открывает 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 Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    =ДВССЫЛ("'БД'!B"&ПОИСКПОЗ(A2;'БД'!A:A;0))
    Но, скорее всего, можно обойтись обычным ВПР()
    Ответ написан
    Комментировать
  • Как изменить приватное сообщение?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Код доходит до;
    if (interaction.customId === 'one') {
    и проходит дальше, не заходя внутрь; далее доходит до:
    if (interaction.customId === 'two') {
    выполняется условие, заходит в if, а там нежданчик:
    mes.edit('новый текст');
    mes не определён нигде ранее.
    Ответ написан
  • Нужен ли корпус или плата для данной схемы?

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

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Судя по скрину - нужен отлов события отпрвки формы. Делаете функцию onFormSubmit(event), назначаете триггер на отправку формы, внутри функции проверяете данные и правите нужные ячейки. Только непонятно, зачем править данные ответов с формы.
    Если данные всё-таки меняются вручную, то нужно делать то же самое, только используя триггер onEdit(event).
    Ответ написан
  • Как правильно парсить цены на предметы Steam в Google Sheets при помощи Google Apps Script?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    1) Если есть массив url, то лучшим вариантом будет использование fetchAll
    2) Если получилась ошибка - можно подождать 2**i секунд и повторить запрос. i - номер итерации.
    Ответ написан
  • Как сделать чередование цветов строк через макрос для непустых строк дипазона?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    spreadsheet.getRange('A5:M35') >> spreadsheet.getDataRange()
    Ответ написан
    Комментировать
  • Как сделать плавный поворот камеры в three.js?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Сделайте targetPosition и приближайтесь к ней постепенно. Например, по 5% разницы текущего положения и targetPosition за шаг, пока расстояние не станет меньше какого-то минимального заданного или по количеству шагов - тогда можно установить конечную позицию и остановить таймер.
    Ответ написан
    Комментировать
  • Почему не работает Math.floor()?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    a /= b;
    a = Math.floor(a*100)/100;
    Ответ написан
    Комментировать
  • Как удалять строчки по истечению времени?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    const currentTime = new Date().getTime();
    содержит и дату и время.
    20:59 скорее всего - только время.
    Чтобы оставить только время, можно сделать как-то так:
    new Date() - new Date().setHours(0,0,0,0)
    Ответ написан
    Комментировать
  • Возможно ли извлечь данные через =IMPORTXML с Wildberries?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Не уверен что можно, а если можно, что это хорошая идея. Вёрстка меняется периодически и данные слетают.
    Для этого разработан официальный API, через него можно забирать почти всё что душа пожелает. В реальной работе парсинг WB страниц тоже используется, но не как основной метод.
    Если сильно хочется - посмотрите что видит гугл, когда запрашивает данные

    /**
    * Открывает 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;
        };
      };
    };


    Или в IMPORTXML поставить * в запросе
    Ответ написан
    Комментировать
  • Получить массив уникальных значений?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    Object.values(array.reduce((acc,val)=>(acc[val.itemUniqId]=val,acc),{}))
    Ответ написан
    Комментировать