【发布时间】:2020-01-08 17:02:40
【问题描述】:
目标:在 Google 表格中,我想让用户只能查看某些文件的权限,同时还允许他们以编程方式编辑这些文件。这样他们就无法手动编辑文件。用户将单击一个按钮来触发对仅查看文件的编辑。
示例:用户将数据输入到他们具有编辑权限的工作表 A 中。单击工作表 A 上的按钮后,在工作表 A 上输入的数据将被复制到现有工作表工作表 B 中的最后一个空行。用户将只能查看工作表 B。请注意,我正在使用工作表 A 和工作表 B 引用单独的文件,每个文件都有一个工作表。
解决方案 A:取自 Google Apps Script - Is it possible to allow change to some cell in Sheets only through GoogleAppScript?。开发一个 Web 应用程序,将数据从工作表 A 复制到工作表 B,并以工作表 B 的所有者身份运行。在工作表 A 内的对话框中显示 Web 应用程序链接,要求用户单击该链接才能完成执行。我的问题是我不希望用户必须单击链接。我想让他们做的就是点击一个按钮。解决此问题的方法可能是让按钮自动打开然后关闭网络应用链接。
解决方案 B:取自 How to allow onEdit function to affect protected cell in a Google Sheet?。开发一个触发器来复制数据并以工作表 B 的所有者身份运行。因为触发器不会在具有仅查看访问权限的文件上运行,所以我必须 1)授予用户对工作表 B 的编辑访问权限和 2)保护所有工作表B 以防止用户手动编辑工作表 B。
解决方案 C(从解决方案 B 反弹):我可以改用简单的 onOpen 触发器。当用户单击按钮时,在做一些事情后,工作表 B 被打开。然后,在 onOpen 触发器中,我必须再次调用以打开文件。那是因为第一次打开将由只有查看权限的用户执行。触发器中的第二次打开将以所有者身份打开文件并允许编程编辑。然后,可以复制数据并关闭文件。
解决方案 D:这是我在发现上述解决方案之前想到的第一个解决方案。通过工作表 A 上的按钮,以编程方式 1) 将工作表 B 的 内容 复制到新工作表工作表 C 中,用户将成为该工作表的所有者(编辑访问权限); 2)将Sheet A的内容粘贴到Sheet C的最后一个空行; 3)将Sheet C的所有权更改为所需的所有者;和 4) 删除工作表 B。我不喜欢这样,因为“复制到”工作表的文件 ID 会持续更改,我正在创建一个额外的文件。
问题:在排除解决方案 D 后,用户单击按钮可以启动的最有效和最不容易出错的解决方案是什么?
我没有在 Excel 中使用密码保护功能进行此类操作,但我是为 Google 表格编程的新手。
【问题讨论】:
-
欢迎来到 StackOverFlow,请借此机会参加 tour 并学习如何使用 How to Ask、format code 和 minimal reproducible example。
标签: javascript button google-apps-script google-sheets triggers