【发布时间】: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