0

表单中使用了“文件上传”部分:我需要表单用户(不是所有者)能够与表单所有者以外的其他人共享文件。

看起来表单中文件上传的结果将文件放入当前表单用户的驱动器中,并提供表单所有者可以查看的 URL。我需要该 URL 可以与其他人共享(通过脚本,而不是手动干预)。

由表单输入触发,我的脚本运行:

DriveApp.getFileById(id).setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.NONE);

...其中 id 派生自表单提供的 URL(请参阅从 Google Apps 脚本上的 URL 获取文件 ID 的最简单方法...因为我知道我得到了正确的 ID)。

作为具有表单链接的用户,我没有收到任何错误......我也没有看到作为所有者在表单中输入的错误。

但是,除了电子表格所有者之外,任何人都无法看到该 URL(即使是输入并拥有该文件的用户也无法查看该链接)......因此 DriveApp.Access.ANYONE_WITH_LINK 无法正常工作。表单的非所有者将运行它。我猜 setSharing 是作为表单的所有者运行的,而不是用户,因此不能将它设置为可共享的?脚本有没有办法使文件/链接可见?

但是,即使表单所有者运行表单,其他人也无法查看该 URL。我认为一旦文件变得可共享,ID 就不会改变?所以我一定是错误地调用了 setSharing 吗?

也许表单提供的 URL 中的 ID 是一些“无人区”,它不是文件的真实 ID?

示例例程使用这些 URL 进入电子表格的第 4 列并使其可共享:

`

function SetPermissions() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var maintsheet = ss.getSheetByName('Maintenance');
  var lastmr = maintsheet.getLastRow();
  for (var i = 2; i <= lastmr; i++) {
    var fileURL = maintsheet.getRange(i,4).getValue();
    Logger.log(fileURL);
    for (var j in fileURL.split(",")) {
      Logger.log(j);
      Logger.log(fileURL.split(",")[j]);
      var fileID = fileURL.split(",")[j].match(/[-\w]{25,}/)[0]
      Logger.log(fileID);
      DriveApp.getFileById(fileID).setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.NONE);
    }
  }
}

`

...由表单/电子表格的所有者运行,没有错误,并且记录的数据看起来正确。但是,将 URL 提供给另一个用户,他们会收到权限错误。

4

2 回答 2

1

这修复了它:

   function SetPermissions() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var maintsheet = ss.getSheetByName('Maintenance');
      var lastmr = maintsheet.getLastRow();
      for (var i = 2; i <= lastmr; i++) {
        var fileURL = maintsheet.getRange(i,4).getValue();
        Logger.log(fileURL);
        for (var j in fileURL.split(",")) {
          Logger.log(fileURL.split(",")[j]);
          var fileID = fileURL.split(",")[j].match(/[-\w]{25,}/)[0]
          Logger.log(fileID);
          var file = DriveApp.getFileById(fileID);
          file.setSharing(DriveApp.Access.ANYONE, DriveApp.Permission.VIEW);
          var newURL = file.getUrl();
          maintsheet.getRange(i, 4).setValue(newURL);
        }
      }
    }

多哈:https ://developers.google.com/apps-script/reference/drive/permission

...我告诉它:任何人都没有链接的权限!VIEW,是正确的选择!

这是一个函数,它给出了表单将粘贴在单元格中的 URL 列表(可以设置表单以允许每个单元格有多个图片),设置权限,并返回 URL 列表,这一次是谷歌格式化getURL() 中的 URL:

function AnyoneWithLinkCanView(urls) {
  var newURLs = "";
  if ( urls.length > 0 ) {
    for each (var j in urls.split(",")) {
      var fileid = j.match(/[-\w]{25,}/)[0];
      var file = DriveApp.getFileById(fileid);
      file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
      if ( newURLs.length > 0 ) {
        newURLs += ", ";
      }
      newURLs += file.getUrl();
    }
  }
  return newURLs;
}

就我而言,由于 URL 将构成电子邮件的消息正文,因此我的调用如下所示:

var message = AnyoneWithLinkCanView(dataSheet.getRange(lastr,i).getValue());
于 2019-02-28T17:58:32.460 回答
0

表单输入作为创建表单触发器的人运行。如果您希望脚本以她的身份运行,请让她访问脚本和创建表单触发器的宏。

于 2019-02-27T17:54:04.410 回答