Желаемая ситуация
Имейте функцию чистой оболочки, чтобы определить текущее используемое приложение GSuite (Документы, листы или слайды в моем случае) и соответственно настроить пользовательский интерфейс.
Начальная настройка кода
Обратите внимание, что я использую Babel для преобразования кода в код, совместимый с ECMAscript2015 / AppScript JS. Мой вопрос касается только общей логики c того, с чем проверять.
export function onInstall(e) {
onOpen(e);
}
function onOpen(e) {
let ui = '';
typeof SpreadsheetApp === 'undefined' ? (ui = DocumentApp.getUi()) : (ui = SpreadsheetApp.getUi());
ui.createMenu('My Addon')
.addItem('Open SideBar', 'showMySidebar')
.addToUi();
}
function showMySidebar() {
const ui = HtmlService.createHtmlOutputFromFile('sidebar').setTitle('My Sidebar');
let env = '';
typeof SpreadsheetApp === 'undefined' ? (env = DocumentApp.getUi()) : (env = SpreadsheetApp.getUi());
env.showSidebar(ui);
}
Результат
Это работает только в Google Sheets. При попытке запустить скрипт как дополнение в Google Docs появляется сообщение «Невозможно выполнить SpreadsheetApp.getui () из этого контекста».
Текущая настройка кода
export function onInstall(e) {
onOpen(e);
}
function onOpen(e) {
let ui = '';
try {
ui = SpreadsheetApp.getUi();
} catch (e) {
ui = DocumentApp.getUi();
}
ui.createMenu('My Addon')
.addItem('Open SideBar', 'showMySidebar')
.addToUi();
}
function showMySidebar() {
const ui = HtmlService.createHtmlOutputFromFile('sidebar').setTitle('My Sidebar');
let env = '';
try {
env = SpreadsheetApp.getUi();
} catch (e) {
env = DocumentApp.getUi();
}
env.showSidebar(ui);
}
Результат
Это работает как в Google Docs, так и в Google Sheets, но не в Google Slides
Challenge
Как динамически проверять среду в скрипте приложений?
Любые мысли и идеи будут с благодарностью.