Replies: 5 comments
-
Вызов функций без аргументов через selectОбъединить функции без аргументов в один выпадающий список // launch.html
{
action: 'runFunction',
title: 'Обновить плейлист',
forms: [
{
key: 'name',
select: [
{ value: 'updatePoolOfMemory', label: 'Омут памяти' },
{ value: 'updateSavedAndForgot', label: 'Любимо и забыто' },
],
},
],
} // main.gs
function runFunction(values){
this[values.select.name]();
}
function updatePoolOfMemory(){
// ...
}
function updateSavedAndForgot(){
// ...
}
Чтобы увидеть в логах конкретное имя вызванной функции, а не общего родителя, измените // launch.html
function onClick(obj, hasArgs) {
let values = hasArgs ? collectArgs(obj.parentId, hasArgs) : {};
let customAction = values.select && values.select.name ? values.select.name : obj.action;
call(obj.action, values, customAction);
console.log(getTime(), 'Запущено', customAction);
}
|
Beta Was this translation helpful? Give feedback.
-
Вызов функций с аргументами через selectОбъединить функции с аргументами в один выпадающий список.
// launch.html
{
action: 'runFuctionArgs',
title: 'Запуск функции',
forms: [
{
key: 'name',
select: [
{ value: 'example1', label: 'Функция 1' },
{ value: 'example2', label: 'Функция 2' },
],
},
{
key: 'playlistUrl',
placeholder: 'Ссылка на плейлист'
},
{
checkbox: [
{ key: 'isRemoveHistory', label: 'Удалить историю', default: true },
{ key: 'isDedup', label: 'Удалить дубликаты' },
],
},
],
}, // main.gs
// При одинаковом наборе аргументов у example1 и example2
// function example1(playlistId, check){}
// function example2(playlistId, check){}
function runFuctionArgs(values){
let playlistId = Helper.parseId(values.text.playlistUrl);
this[values.select.name](playlistId, values.check);
}
// При разном наборе аргументов
// function example1(check){}
// function example2(playlistId, check){}
function runFuctionArgs(values){
if (values.select.name == 'example1'){
example1(playlistId, values.check);
} else if (values.select.name == 'example2'){
let playlistId = Helper.parseId(values.text.playlistUrl);
example2(playlistId, values.check);
}
} |
Beta Was this translation helpful? Give feedback.
-
Возврат результата на страницу// main.gs
function test() {
return 'Эта строка вернулась из обработчика';
}
// Если функция выбирается через select, добавьте return
function runFunction(){
return this[values.select.name]();
} |
Beta Was this translation helpful? Give feedback.
-
Хостинг на GitHubПозволяет задать читаемый адрес вида Настройка
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Goofy</title>
<style>
html, body, iframe { width: 100%; height: 100%; margin: 0; border: 0; }
</style>
</head>
<body>
<iframe src="https://script.google.com/macros/s/abc/exec"></iframe>
</body>
</html>
ОбновлениеЕсли вы изменяете код в Apps Script, нужно обновить и развертывание. Иначе запускаемые со страницы функции будут работать без применения изменений.
|
Beta Was this translation helpful? Give feedback.
-
Сохранить введенное значениеСейчас с помощью Единственный недостаток такого подхода в количестве создаваемых файлов. Когда нужно следить за несколькими значениями в разных обработчиках. Простой код из
Перед началом обновите содержание модуля Helper. В примере текстовое поле. Последняя введенная ссылка парсится и сохраняется в кэш. Если поле оставили пустым, значение берется из кэша. То есть будет соответствовать прошлому вводу. // launch.html
{
action: 'removeRecentTracks',
title: 'Удалить недавние треки',
forms: [
{ key: 'playlistUrl', placeholder: 'Ссылка на плейлист' },
]
}, // main.gs
function removeRecentTracks(values) {
const ACTION_ID = 'ActionRemoveRecentTracks';
let state = Helper.readState(ACTION_ID);
if (values.text.playlistUrl.length > 0) {
state.playlistId = Helper.parseId(values.text.playlistUrl);
Helper.updateState(ACTION_ID, state);
}
let tracks = Source.getPlaylistTracks('', state.playlistId);
} В результате файл будет иметь следующую структуру. В корне id действий с объектом из сохраненных значений. {
"ActionRemoveRecentTracks": {
"playlistId": "37i9dfwe1E37zggedVTf"
}
} Сохраняемое значение неограниченно строкой. Можно,например, ввести массив и пополнять его с каждого ввода. const ACTION_ID = 'ActionUpdateRadioByGenres';
let state = Helper.readState(ACTION_ID);
state.genres = state.genres || [];
state.genres.push(values.text.genre);
Helper.updateState(ACTION_ID, state); На данный момент нельзя отобразить эти значения на самой странице. Но скорее всего это возможно. Попробую реализовать позже. |
Beta Was this translation helpful? Give feedback.
-
Важно
Для тех, кто уже пользовался инструкций. Последнее обновление изменило
const func
. Теперь этоACTIONS
с другими именами у ключей. Сделано для упрощения. Раньше были одинаковые названия ключей на разных уровнях, напримерname
. Также, при указании одинаковой функции в разных формах будет корректная обработка (багфикс). Других изменений нет.Если фикс или улучшенная читаемость для вас неактуальны, обновляться не нужно.
Описание
Небольшая страница с формами, позволяющая запускать функции goofy без триггера и редактора кода. Возможно передать аргументы. Например, ссылку на плейлист, предопределенное значение и прочее. Доступно на компьютере и телефоне.
Ниже пример получаемой страницы. Повторить несложно, подробности дальше.
Обновления
Полезные примеры
Установка
helper.gs
и вставьте кодlibrary.gs
заменяем функциюdoGet
launch.html
и вставьте кодначать развертывание
-пробные развертывания
. Скопировать предлагаемую ссылку.Настройка
Найдите в файле
launch.html
строчкуconst ACTIONS
- это массив объектов для генерации страницы.Один объект состоит из трех ключей:
action
- имя функции. Она будет запускаться при нажатии кнопки.title
- заголовок, просто текст.forms
- объекты для генерации форм.Выберите необходимую форму и вставьте в массив
ACTIONS
. Количество форм неограниченно. Можно комбинировать разные друг с другом. Порядок в массиве определяет порядок на странице.Затем в файле
main.gs
(или создать новый) нужно определить функции с именами изaction
. Нажатие кнопки запускает функцию.Значения из форм передаются в объекте
values
, состоящему из:text
- значения текстовых полей поkey
. Типстрока
.select
- значенияvalue
поkey
. Типстрока
.check
- значения чекбоксов поkey
. Типбулево
.range
- значения диапазонов поkey
. Типчисло
.Формы
Без аргументов
Просто запуск функции. Удобнее такой формат.
Текстовое поле
Ввести произвольный текст
Форма
key
- название ключа, по которому доступен введенный текстplaceholder
- текст-подсказкаВыбор значения
Выбрать одно значение из списка
Форма
key
- название ключа, по которому доступно выбранное значениеselect
- список значенийvalue
- значение для кодаlabel
- текстовая подписьВ примере комбинируется выбор значения и текстовое поле. Если
customStation
определено, не пустая строка, берется она. Когда неопределенно,station
со значением из выпадающего списка.Чекбокс
Включить или отключить
Форма
checkbox
- список чекбоксовkey
- название ключа, по которому доступно выбранное значениеlabel
- текстовая подписьdefault
- значение по умолчаниюДиапазон
Выбрать числовое значение из диапазона
Форма
range
- список диапазоновkey
- название ключа, по которому доступно выбранное значениеlabel
- текстовая подписьmin
- минимальное значение диапазонаmax
- максимальное значение диапазонаstep
- шаг сдвигаdefault
- значение по умолчаниюBeta Was this translation helpful? Give feedback.
All reactions