Выгружаем данные из таблиц в html

В предыдущих постах я рассматривал возможность отправки результатов обработки списка акций в зависимости от требуемых критериев:

в которых получали следующие списки акций:

Акции, стоимость которых падает 3 дня

Акции, стоимость которых ниже 70% от максимальной годовой

с последующей отправкой этих результатов на личную почту.

А что если сделать эту информацию публичной?

То есть чтобы она была видна, допустим, даже на этом сайте.

В этом нам поможет развёртывание Гугл веб-аппа с последующей интеграцией его в тело поста или страницы.

Шаг 1 — получаем необходимые данные в массивы

Тут все просто, составляющие кода ниже я разбирал уже неоднократно в предыдущих постах

const url = "https://docs.google.com/spreadsheets/d/1PlQFPaH86ZaEhJo-ymsn41grJ4qzb3HdOTFP8LOwtZc/";
const ws = SpreadsheetApp.openByUrl(url);
const ss07Stock = ws.getSheetByName('07ToMaxStock');
const ss3DaysStock = ws.getSheetByName('3DaysFall');

function get07Stock() {
const stockArr = ss07Stock.getDataRange().getValues();
return stockArr;

}

function get3DaysStock() {
const stockArr = ss3DaysStock.getDataRange().getValues();
return stockArr;
}

Где function get07Stock() возвращает массив с акциями ниже 70% от максимальной стоимости этих акций за год, а function get3DaysStock() возвращает массив с акциями, цена которых падает на протяжении последних трёх дней.

Шаг 2 — конечно же doGet

function doGet(){
const stockTemplate = HtmlService.createTemplateFromFile('index');
const resultArr = get07Stock();
const resultArr1 = get3DaysStock();

stockTemplate.resultTable07Stock = resultArr.map(row =>`<tr><td>${row[0]}</td><td>${row[1]}</td><td>${row[2]}</td><td>${row[3]}</td></tr>`).join('');

stockTemplate.resultTable3DaysStock = resultArr1.map(row1 =>`<tr><td>${row1[0]}</td><td>${row1[1]}</td><td>${row1[2]}</td><td>${row1[3]}</td><td>${row1[4]}</td></tr>`).join('');

return stockTemplate.evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}

Пока какая-то аброкадабра, не правда ли?

Но, если разбираться построчно, то:

stockTemplate.resultTable07Stock = resultArr.map(row =>`<tr><td>${row[0]}</td><td>${row[1]}</td><td>${row[2]}</td><td>${row[3]}</td></tr>`).join('');

в объект stockTemplate по ключу resultTable07Stock присваивается значение resultArr.map(row =>`<tr><td>${row[0]}</td><td>${row[1]}</td><td>${row[2]}</td><td>${row[3]}</td></tr>`) которое есть ни что иное как table row и table data данных из массива «превращённое» с помощью в .join('') обычный текст.

stockTemplate.resultTable3DaysStock = resultArr1.map(row1 =>`<tr><td>${row1[0]}</td><td>${row1[1]}</td><td>${row1[2]}</td><td>${row1[3]}</td><td>${row1[4]}</td></tr>`).join('');

ровно то же самое, только столбцов на один больше.

а дальше идёт возврат объекта HtmlService через stockTemplate.evaluate()

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

Чтобы была возможность встроить его в сторонний сайт требуется .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);

Шаг 3 — html со встроенными переменными

Шаг 4 — deploy as web app

и больше ничего. Здесь нужна только ссылка на веб апп:

https://script.google.com/macros/s/AKfycbyulWNY_uiF9iYVZeNocSdciviKtyaOwPuB_77JgKSHxo-bG_gw9ql9y2FpKfEIpf3New/exec

Шаг 5 — встраиваем в сайт при помощи <iframe>

Здесь так же не сильно много кода:

И в результате:


Ваше мнение важно и может улучшить блог

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

У этой записи 6 комментариев

  1. Units

    Ошибку пишет в коде
    stockTemplate.resultTable07Stock = resultArr.map(row=>`${row[0]}${row[1]}${row[2]}${row[3]}`).join(»);
    stockTemplate.resultTable3DaysStock = resultArr1.map(row1 =>`${row1[0]}${row1[1]}${row1[2]}${row1[3]}${row1[4]}`).join(»);

    1. А какую именно ошибку пишет?
      Что консоль говорит?
      Скорее всего дело в кавычках .join(»);.
      попробуйте вот это:

      stockTemplate.resultTable07Stock = resultArr.map(row =>`

      ${row[0]} ${row[1]} ${row[2]} ${row[3]}

      `).join('');

      stockTemplate.resultTable3DaysStock = resultArr1.map(row1 =>`

      ${row1[0]} ${row1[1]} ${row1[2]} ${row1[3]} ${row1[4]}

      `)
      .join('');

  2. Алексей

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

    1. Добрый день, Алексей.
      Можно, конечно, заморочиться и сделать все как полноценное приложение.
      Но, можно намного проще — посмотрите в сторону google forms, которые позволяют сохранять данные в google sheets, откуда с ними можно дальше делать все, что пожелаете.

  3. Олег

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

    1. Олег, добрый день.
      С примером было бы конечно проще…..
      Но так, навскидку если:
      1. Попробуйте вставлять форму не как через iframe — гугл вообще с ними не очень дружит, а как именно форму. Там справа в самом низу есть опции того, что хотите вставить — презентацию, документ, форму и тд. Форма прекрасно вставляется и работает.
      2. Можно форму не через iframe, а через ссылку, в том числе поставив галку на короткий линк. И вставить его в гугл сайт через «Встроить» и «Вставить URL». Далее будет опция выбора либо просто просмотра, либо полностью для изменений — тут уж выбирайте что нужно.

      Вообще тема с гуглосайтом и вставкой URL весьма интересная — если развернуть отдельно взятый script как webapp и получить ссылку на него с окончанием «exec» то можно обойти по сути все базовые ограничения по шрифтам и так далее — вот например мой старый (и уже частично неработающий) webapp по поиску книг, встроенный в сайт — https://sites.google.com/view/embeddedwithscripts. Html веб приложения вообще написан с использованием materializecss и никакого отношения ко всем преднастроенным вещам гуглосайта не имеет 🙂

Добавить комментарий