首页 > 解决方案 > 同一脚本中的 Google 文档、Google 表格或 Google 幻灯片的插件菜单?

问题描述

期望的情况

有一个干净的包装函数确定当前正在使用的 GSuite 应用程序(在我的例子中是文档、表格或幻灯片)并相应地设置 UI。

初始代码设置

请注意,我使用 Babel 将代码转换为与 ECMAscript2015/AppScript 兼容的 JS 代码。我的问题仅与检查内容的整体逻辑有关。

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 表格。尝试在 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);
}

结果

这适用于谷歌文档和谷歌表格,但不适用于谷歌幻灯片

挑战

如何在 Apps 脚本中动态检查环境?

任何想法和见解将不胜感激。

标签: javascriptgoogle-apps-script

解决方案


推荐阅读