Ответы пользователя по тегу JavaScript
  • Как встроить Форму на сайт со своим дизайном?

    oshliaer
    @oshliaer
    Google Products Expert
    На сайте https://oshliaer.github.io/qna?target=contacts используется Форма Гугл

    65fc7a5bb6bf5232365034.png

    Основная часть

    const sendGoogleForm_ = async ({ name, message, contact, target }) => {
        const url = 'https://docs.google.com/forms/u/0/d/e/' + scope_.googleFormId + '/formResponse';
    
        const formData = new FormData();
        formData.append('entry.563792130', name);
        formData.append('entry.2109788644', message);
        formData.append('entry.1663728525', contact);
        formData.append('entry.935276218', target);
    
        return fetch(url, { mode: 'no-cors', method: 'post', body: formData });
      };
    Ответ написан
    Комментировать
  • Как деобфусцировать этот JS?

    oshliaer
    @oshliaer
    Google Products Expert


    Однако, молодцы! Насколько можно судить, теперь вам нужно решить квест по преобразованию, конкатенации строк и их исполнению.

    Автоматически, скорее всего, пока этого сделать нельзя, или нужно иметь какой-то крутой инструмент, который на Q&A не найдешь.

    Ставьте логи, конкатенируйте, преобразуйте. Пока задача не кажется неразрешимой.
    Ответ написан
    Комментировать
  • Как сделать скрипт что бы по условию вырезал (копировать а потом удалил) строку в одном листе таблице и вставить ее в другом?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Решение в комментарии к вопросу https://qna.habr.com/q/1257512#clarification_1691774
    Ответ написан
    Комментировать
  • Как подписать на вебхуки СДЭК гугл таблицу?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Если 'Content-Type': 'application/json', то 'payload': JSON.stringify(data)
    Ответ написан
    Комментировать
  • Как генерировать pdf как на сайте Destra?

    oshliaer
    @oshliaer
    Google Products Expert
    pdfmake отлично справляется с генерацией PDF как на клиенте, так и на сервере. Для описания выходящего документа требуется объект-определитель.

    Если использовать эту библиотеку, то вам потребуется только создание пользовательского интерфейса. В принципе ничего кроме пары функций состояния и нажатия кнопки не требуется.
    Ответ написан
    1 комментарий
  • Как забирать данные из Google Таблицы и вставлять их на сайт в поля?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Варианты решений:
    • Читать непосредственно Таблицу через Google Sheets API (тоже, что читать экспортируемый файл). Это самый быстрый и надежный способ, но есть ограничения как по доступу, так и по частоте обращений
    • Читать Таблицу в файл на сайт. Это самый умный и качественный способ, но можно столкнуться с тем, что потребуется внешний ресурс для автоматизации задачи
    • Читать опубликованную Таблицу. Публикация данных происходит не мгновенно, но если данные обновляются не часто, возможно, это лучший способ.
    • Читать данные через Google Apps Script. Один из наиболее защищенных и простых способов. Может иметь ограничения на скорость поставки данных.


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

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Дубликат https://ru.stackoverflow.com/q/1412667/178725. Не создавайте множество тем на разных ресурсах - это нехорошо.

    Довольно странное задание. Попробуйте обрабатывать как сплошной массив разнородных данных.

    function myFunction() {
      const book = SpreadsheetApp.getActiveSpreadsheet();
      const sheet = book.getSheetByName('Лист');
      const range = sheet.getRange('A1:L4');
      const values = range.getValues();
      range.setValues(calculate_(values));
    }
    
    /**
     * @param {any[][]} values
     * @returns {any[][]}
     */
    function calculate_(values) {
      return values.map((row, i) => {
        const collection = row.slice(0, 3);
        return row.map(((cell, j) => {
          if (i < 1 || j < 3) return cell;
          const header = values[0][j];
          return collection.includes(header) ? 1 : '';
        }));
      });
    }


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

    Пример в Таблице https://docs.google.com/spreadsheets/d/1paJxOTNK01...

    628b8be3ac80a500865027.png
    Ответ написан
    2 комментария
  • Как на js сделать редирект на другую страницу после заполнения встроенной в страницу Google Form?

    oshliaer
    @oshliaer
    Google Products Expert
    Никак. Вы можете показывать Форму в своем фрейме и отслеживать ее состояние.

    Другой вариант - добавить в сообщение после заполнения Формы со ссылкой на переход.

    Еще вариант, обернуть ссылку Гугл Формы своей html формой.
    Ответ написан
    Комментировать
  • Есть ли JavaScript библиотека максимально похожая на Google Sheets?

    oshliaer
    @oshliaer
    Google Products Expert
    Возможно, лучшим предложением будет https://myliang.github.io/x-spreadsheet
    60163c8f90202752482539.png
    в то время, как контейнером таблицы я бы предпочел https://sheetjs.com за надежность. Если у вас нет необходимости в формулах, то возьмите второе.
    60163c63d87f3460037426.png
    Ответ написан
    2 комментария
  • Как вытащить из базы данных прошедшие годы?

    oshliaer
    @oshliaer
    Google Products Expert
    Не понятно, причем тут Таблицы?

    Чтобы получить список годов из приведенного массива, можно сделать

    [
      {
        vid: 221,
        age: 4,
        bdate: "2020-05-27T15:00:00-04:00",
        type: "Ұрғашы бұзау",
        statusChangeTime: "2020-10-19T04:27:05.000Z",
      },
      {
        vid: 225,
        age: 6,
        bdate: "2020-07-09T15:00:00-04:00",
        type: "Ұрғашы бұзау",
        statusChangeTime: "",
      },
      {
        vid: -34,
        age: 7,
        bdate: "2020-02-21T14:00:00-05:00",
        type: "Ұрғашы бұзау",
        statusChangeTime: "2020-10-17T05:17:55.000Z",
      },
      {
        vid: -30,
        age: 4,
        bdate: "2019-01-03T14:00:00-05:00",
        type: "Еркек бұзау",
        statusChangeTime: "2019-05-06T07:24:00.000Z",
      },
    ]
      .map((item) => +("" || item.bdate).split("-")[0])
      .filter((y, i, a) => a.indexOf(y) === i);


    Выведет

    > [2020, 2019]
    Ответ написан
    2 комментария
  • Как дописывать в гугл таблицу значения при сабмите формы с помощью developers.google.com/sheets/api/?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Чтобы воспользоваться такой возможностью, в целях безопасности, вам нужно использовать промежуточный сервер, который будет авторизироваться за вас. Это может быть минимальный облачный сервер, или облачная функция, или опубликованное веб-приложение на Google Apps Script.
    Ответ написан
    Комментировать
  • Как запустить 10-15 функции последовательно в google apps script?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    С некоторой долей вероятности можно предположить, что вот это будет работать

    /**
     *
     */
    const SETTINGS = Object.freeze({
      fns: [
        'danon',
        'mars',
        'curren1',
        'curren2',
        'vilma',
        'seitek',
        'radost',
        'rolls',
        'lysse',
      ],
    });
    
    /**
     *
     */
    function addTriggers() {
      ScriptApp.getProjectTriggers().forEach((trigger) => {
        if (
          trigger.getEventType() === ScriptApp.EventType.CLOCK &&
          SETTINGS.fns.includes(trigger.getHandlerFunction())
        ) {
          ScriptApp.deleteTrigger(trigger);
        }
      });
      SETTINGS.fns.forEach((fn) =>
        ScriptApp.newTrigger(fn).timeBased().everyHours(6).create()
      );
    }


    Триггерам ничего не мешает работать параллельно, поэтому ошибок быть не должно.
    Ответ написан
    Комментировать
  • Вопрос о правах доступа, или как защищаются google табличные скрипты?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Скрипты никак не связаны с ограничением на ввод в ячейку, потому что скрипты это REST.
    • Если вы удалите скрипт, то защита ячеек никак не изменится.
    • Если вы попробуете изменить скрипт так, чтобы значение защищенных (условно от вас) ячеек изменилось, то сработает защита.
    • Если вы измените скрипт пользовательской функции так, чтобы она возвращала другое значение, то в защищенной ячейке она будет возвращать другое значение, но само значение ячейки по прежнему не изменить.


    По моему мнению (а ровно и по мнению Гугл) никаких логических противоречий.

    Ни в каких ячейках никаких скриптов не находится. Google Apps Script - это синтаксический сахар для Google REST API.

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

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

    Особенно отмечу бессмысленность сравнения VBA и GAS.
    Ответ написан
  • Скрипты в Google Sheets, как начать с нуля?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Ответ написан
    Комментировать
  • Google Таблицы. Как избежать ошибки "Максимальное количество символов в одной ячейке: 50000"?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Вам необходимо следить, чтобы общее количество ячеек было менее 5млн, т.к. это общее ограничение на данные в Таблицах.

    1. Простой способ проверить количество используемых ячеек
    2. Удалить лишнее/пустые. Называется "обрезать таблицу"
    Ответ написан
    Комментировать
  • Возможно ли в Google Sheets каким-либо образом фиксировать дату изменения значения ячейки?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Формулы не могут сохранить состояние ячейки, поэтому необходимо использовать скрипты.
    Общий код выглядит так

    function myFunction(e) {
    
      try {
        if (!e || !e.range) return;
        if (e.range.columnStart > 1) {
          var targetCell = SpreadsheetApp.getActiveSheet()
            .getRange(e.range.rowStart, 1, e.range.rowEnd - e.range.rowStart + 1);
    
          /* if you want insert the date once uncomment the row below
          *
          **/
          // if(!targetCell.getValue())
          targetCell.setValue(new Date());
          
        }
      } catch (err) {
        SpreadsheetApp.getActiveSpreadsheet().toast(err.message, 'Error!!1');
      }
    }


    Пример для тестирование и объяснение можно посмотреть тут https://gist.github.com/contributorpw/b179e819c0ee...
    Ответ написан
  • Как скачать файл средствами google apps script?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Вариантов загрузки может быть несколько. Как и способов создания файла. Из вопроса не ясно, как создается файл, каие требования предъявляются к загрузке, какой интерфейс используется.
    Предположим, что:
    1. Файл создается в момент загрузки
    2. Файл сохраняется на Диске
    3. Файл загружается через основной интерфейс приложения Таблицы Google

    Основной идеей экспорта/скачивания файлов из Диска является получение ссылки на ресурс
    var file = DriveApp.createFile(fileName, content, 'text/html');
    var downloadUrl = file.getDownloadUrl();

    Теперь достаточно создать событие на стороне клиента, котрое вызовет загрузку. Вариантов может быть несколько. Вот один из них:
    // Создаем окно на клиенте и запускаем
    var a = window.document.createElement('a');
    a.href = downloadUrl;
    a.text = 'Download';
    document.body.appendChild(a);
    a.click();

    В данном месте самое сложное - поставить пользователю интерфейс для реализации загрузки. Это может быть и письмо, и нотификация, и все, что угодно, что может нажимать ссылки.

    Другим вариантом может быть поставка блока данных через Client-side API. Принцип останется прежним, изменится только формат передаваемых данных. С сервера Blob, на клиенте загрузка локального Blob-ресурса.

    Полный код и ссылка на рабочее приложение https://gitlab.com/google-apps-script-russian/zagr...
    Ответ написан
    Комментировать
  • Как отправить данные javaScript - ом в гугл таблицы?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    1. Ваша функция на сервере Google Apps Script ничего не возвращает.
    2. Ваш сервер на Google Apps Script ожидает GET-запрос.

    Код сервера
    function doPost(e){
      var response = {};
      try {
        var sheet = SpreadsheetApp.openById('1iZazQ8YSMa6b9WFKTHJ99WooEC48nH9IF1x9fh6dQ9Y');
        sheet.appendRow([new Date(), JSON.stringify(e)]);
        response = {'result': 'OK'};
      } catch(err) {
        response = {'error': 'error'};
      } finally {    
        return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
      }
    }


    С уважением.
    Ответ написан
    Комментировать
  • Как сгенерить md5 строку на Google Script?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Здравствуйте.

    Мне кажется, что у вас неполные представления о методах Google Apps Script, алгоритмах хэширования и системах исчисления.

    Во-первых, computeDigest возвращает массив Byte[], что он и должен делать.
    Во-вторых, вам просто его надо "преобразовать в 16-ричную хэш строку", как сказано выше.

    Попробуйте сделать так:

    function test(){
      Logger.log(toMD5('56'));
    }
    const toMD5 = function(charset, toByte) {
      charset = charset || Utilities.Charset.UTF_8;
      var digest = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, this, charset);
      if(toByte) return digest;
      var __ = '';
      for (i = 0; i < digest.length; i++) {
        var byte = digest[i];
        if (byte < 0) byte += 256;
        var bStr = byte.toString(16);
        if (bStr.length == 1) bStr = '0' + bStr;
        __ += bStr;
      }
      return __;
    }
    Ответ написан
    Комментировать