首页 > 解决方案 > 为什么 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-apps-scriptgoogle-sheetsgoogle-sheets-api

解决方案


虽然您在技术上可以与非 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);
}

推荐阅读