В предыдущих постах я рассматривал возможность отправки результатов обработки списка акций в зависимости от требуемых критериев:
в которых получали следующие списки акций:
Акции, стоимость которых падает 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
и больше ничего. Здесь нужна только ссылка на веб апп:
Шаг 5 — встраиваем в сайт при помощи <iframe>
Здесь так же не сильно много кода:
И в результате:
Ваше мнение важно и может улучшить блог
Я хочу услышать ваше мнение и ваши идеи о том, как сделать этот сайт еще лучше. Примите участие в опросе, чтобы поделиться вашими пожеланиями, предложениями и замечаниями. Пройдите опрос сейчас и помогите сделать этот сайт более полезным для вас!
Ошибку пишет в коде
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(»);
А какую именно ошибку пишет?
Что консоль говорит?
Скорее всего дело в кавычках .join(»);.
попробуйте вот это:
stockTemplate.resultTable07Stock = resultArr.map(row =>`
`).join('');
stockTemplate.resultTable3DaysStock = resultArr1.map(row1 =>`
`)
.join('');
А можно ли как-то опубликовать во фрейме и чтобы правки можно было вносить?
я подготовил страницу, поставил защиту на лист, оставил только нужные пару ячеек, надо генерить доку и сохранять
Добрый день, Алексей.
Можно, конечно, заморочиться и сделать все как полноценное приложение.
Но, можно намного проще — посмотрите в сторону google forms, которые позволяют сохранять данные в google sheets, откуда с ними можно дальше делать все, что пожелаете.
Дмитрий, добрый день.
Подскажите, почему после публикации формы на гугл-сайте, пользователи могут видеть только главную страницу, а страничку с формой (добавленную через iframe) не видят.
Сайт выдает ошибку. Может нужно дать доступ к файлам формы на гугл-диске?
Олег, добрый день.
С примером было бы конечно проще…..
Но так, навскидку если:
1. Попробуйте вставлять форму не как через iframe — гугл вообще с ними не очень дружит, а как именно форму. Там справа в самом низу есть опции того, что хотите вставить — презентацию, документ, форму и тд. Форма прекрасно вставляется и работает.
2. Можно форму не через iframe, а через ссылку, в том числе поставив галку на короткий линк. И вставить его в гугл сайт через «Встроить» и «Вставить URL». Далее будет опция выбора либо просто просмотра, либо полностью для изменений — тут уж выбирайте что нужно.
Вообще тема с гуглосайтом и вставкой URL весьма интересная — если развернуть отдельно взятый script как webapp и получить ссылку на него с окончанием «exec» то можно обойти по сути все базовые ограничения по шрифтам и так далее — вот например мой старый (и уже частично неработающий) webapp по поиску книг, встроенный в сайт — https://sites.google.com/view/embeddedwithscripts. Html веб приложения вообще написан с использованием materializecss и никакого отношения ко всем преднастроенным вещам гуглосайта не имеет 🙂