google-apps-script - 为什么 addViewer 不适用于非 Google 帐户?
问题描述
我正在尝试构建一个脚本,当将电子邮件添加到另一个电子表格时,该脚本将与电子邮件共享电子表格。
我找到了一个示例并对其稍作修改,因此我现在有了一个成功共享文件的函数(它由包含电子邮件的电子表格中的任何更改触发)。
//ssX -- object of spreadsheet to be shared
function permissionsNemail(emailList, linkData, ssX){
var badEmails = [];
for(user in emailList){
try{
//Give permissions to edit.
ssX.addViewer(emailList[user][0]);
}catch(e){
badEmails.push(emailList[user][0]);
};
};
return badEmails;
};
当电子邮件与 Google 帐户(可以是 @gmail.com 或自定义域)相关联时,这可以正常工作。但是,当电子邮件与 Google 没有关联时(例如 @yahoo.com 等),它根本不起作用。除了这个没有帮助的https://support.google.com/a/answer/6033939之外,找不到任何东西。困扰我的是,当我手动共享文件时,它可以是任何电子邮件,而不仅仅是 Google 的。这里有人有什么建议吗?
解决方案
虽然您在技术上可以与非 Google 帐户共享文件 - 与您共享的人将无法打开文件,除非他使用 Google 帐户登录
- 因此,尝试与没有 Google 帐户的人直接共享文件是没有意义的
- 唯一的例外是,如果您向此人提供共享链接并将选项设置为“互联网上任何拥有此链接的人都可以查看”
- 在这种情况下,可以在隐身模式下查看文件,并且不需要使用 Google 登录
- 如果这是您想要使用 Apps 脚本执行的操作 - 您应该setSharing()而不是将查看器添加到文件中
样本:
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var id = ss.getId();
var file = DriveApp.getFileById(id);
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
var url = file.getUrl();
GmailApp.sendEmail("userEmail", "Here is the view link", url);
}
更新
如果您确实想在 Apps Script 中与非 Google 帐户共享文件,您可以使用Drive API上的Advanced Drive Service来完成
示例如何在 Apps 脚本中执行此操作:
function myFunction2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var id = ss.getId();
var resource = {
"role": "reader",
"type": "user",
"value": "userEmail"
}
Drive.Permissions.insert(resource, id);
}
推荐阅读
- android - 为什么 R8 不重命名所有方法和类?
- python - EOFError 用尽输入
- php - 使用 PHP Guzzle 的 Salesforce RestAPI 可以进行身份验证但无法进行查询
- ui-automation - 如何通过脚本在zephyr中标记katalon测试执行?
- kotlin - 如何使“不适当的阻塞方法调用”合适?
- kotlin - 声明抽象类时指定子类
- java - 从 SWT 3 切换到 SWT 4 时,JAVA SWT KeyDown 事件触发了 3 次而不是 1 次
- javascript - 如何用一个按钮调用两个函数
- fancybox - fancybox - 我可以将参数传递给链接到工具栏中的新自定义按钮的函数吗?
- node.js - 每个获取请求的更新日期