【问题标题】:Giving access to a Google Spreadsheet and its accompanying Apps Script授予对 Google 电子表格及其随附的 Apps 脚本的访问权限
【发布时间】:2022-12-07 12:12:51
【问题描述】:

我有一个用于管理大量内容的电子表格,其中包含我编写的脚本,该脚本在菜单中添加了一个“导出”按钮。单击按钮时,脚本会获取所有适当的数据并以特定方式对其进行格式化。格式化版本保存在我的谷歌驱动器中,带有时间戳,但也提供了下载链接。如果需要修改,我将在下面包含脚本的简化版本。

我很少使用 Google 的 Apps 脚本,所以我对它的来龙去脉很不熟悉。我只知道基础知识(如何编写一个脚本,当从电子表格页面完成某事时可以运行)。

我知道我可以邀请用户访问我的电子表格(或只是将其公开),但这似乎并没有附带脚本。脚本和所有正在完成的格式设置是我邀请的人需要的主要部分。我知道要使 file.getDownloadUrl() 正常工作(假设文件仍保存在我的驱动器上),我还需要授予个人访问该文件夹的权限,这不是问题。

问题是,如何让他们访问脚本以便他们获得“导出”菜单项?我做不到吗?我基本上仅限于创建一个绑定了导出功能的按钮吗?

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var csvMenuEntries = [
    {
      name: "Export as CSV",
      functionName: "csvExport"
    },
    {
      name: "Export for wiki",
      functionName: "wikiExport"
    }
  ]
  ss.addMenu("Export", csvMenuEntries)
}

function prepare(type) {
  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const ssName = ss.getName()
  const sheet = ss.getSheets()[0]
  const sheetName = sheet.getSheetName()
  
  const folderName = ssName + ' exports'
  let folder
  try {
    folder = DriveApp.getFoldersByName(folderName).next()
  } catch (err) {
    folder = DriveApp.createFolder(folderName)
  }
  let fileName
  if (type) {
    const extension = type === 'csv' ? 'csv' : 'txt'
    fileName = ssName + '_' + sheetName + `_${type}_` + new Date().getTime() + `.${extension}`
  }

  return { ss, ssName, sheet, sheetName, folder, fileName }
}

function download(file) {
  const downloadURL = file.getDownloadUrl().slice(0, -8)
  showUrl(downloadURL)
}

function showUrl(downloadURL) {
  var link = HtmlService.createHtmlOutput(`<a href="${downloadURL}">Click here to download</a>`)
  SpreadsheetApp.getUi().showModalDialog(link, 'Your file is ready!')
}

function csvExport() {
  const { ss, sheet, folder, fileName } = prepare('csv')

  const csvSettings = getCsvSettings(ss)
  const csvFile = convertRangeToCsv(sheet, csvSettings) // not going to share this. It's simple but irrelevant
  const file = folder.createFile(fileName, csvFile)

  download(file)
}

function wikiExport() {
  const { sheet, folder, fileName } = prepare('wiki')

  const wikiFile = convertRangeToWikiFormat(sheet) // not going to share this. It's simple but irrelevant
  const file = folder.createFile(fileName, wikiFile)

  download(file)
}

【问题讨论】:

  • 您是否授予用户查看者或编辑者访问权限?他们需要编辑权限才能运行onOpen()
  • @Daniel 编辑访问。我已经通过公开编辑并在隐身窗口中打开它来测试它并且菜单选项从未显示过,所以我不确定对于实际被邀请编辑它的人来说它的行为是否不同。
  • 当用户被邀请时,它的行为确实有所不同。匿名用户目前无法与脚本交互。我发布了一个包含更深入细节的答案。

标签: google-apps-script google-sheets


【解决方案1】:

container-bound script 与其父电子表格具有相同的访问权限,因此如果您正在共享电子表格,那么您也在共享脚本(尽管如果他们只有查看权限,则他们必须创建自己的副本才能看到它):

所有容器绑定脚本都使用为容器文件定义的相同所有者、查看者和编辑者访问列表。

考虑到这一点,使用脚本时有一些限制。首先,它们不会为匿名用户(即未登录的用户)触发,即使工作表对公众是可编辑的。您会注意到,如果您尝试以匿名方式打开脚本编辑器,系统会要求您登录。在 Google 的问题跟踪器 here 上还有一个允许此操作的功能请求。

其次,即使用户已登录,Apps Scripts triggers 也有其他限制:

onOpen(e) 在用户打开电子表格、文档、演示文稿或用户有权编辑的表单时运行。

用户需要获得编辑文件的权限,onOpen() 触发器才能运行。如果他们有查看者或评论者访问权限,则菜单不会显示。事实上,您会发现如果用户只有查看者访问权限,大多数脚本功能将不起作用,因为他们需要编辑访问权限才能与工作表进行大多数交互。

因此,如果您希望显示此菜单,则需要为您的用户提供明确的编辑器访问权限。如果您真的必须将工作表保持为只读或想与匿名用户交互,您可以考虑构建一个Web App,让用户从那里获取下载链接。 Web 应用程序可以通过后端或工作表 communicate 的方式,因此您也应该能够以这种方式重现当前代码。

参考:

【讨论】:

    猜你喜欢
    • 2015-03-29
    • 1970-01-01
    • 2014-08-29
    • 2020-10-19
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2022-08-04
    相关资源
    最近更新 更多