尝试为通过表单 "file upload" 部分上传的文件设置 "anyone with link can view" 的权限

Trying to set permissions for "anyone with link can view" on file uploaded via form "file upload" section

表单中使用了一个 "File upload" 部分:我需要表单用户(不是所有者)才能与表单所有者以外的其他人共享文件。

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

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

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

... 其中 id 派生自表单提供的 URL(请参阅 Easiest way to get file ID from URL on Google Apps Script ... 据我所知,我的 ID 是正确的)。

作为对表单使用 link 的用户,我没有收到任何错误...也没有看到以所有者身份输入表单的错误。

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

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

也许表单提供的 URL 中的 ID 是 n 一些 "no-mans-land" 而不是文件的真实 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);
    }
  }
}

`

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

表单输入 运行 作为创建表单触发器的人。如果您希望脚本 运行 为她授予她访问脚本和创建表单触发器的宏的权限。

已修复:

   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

...我是在告诉它:没有权限给任何拥有 link 的人! VIEW,是正确的选择!

这是一个函数,它给出了表单将粘贴在单元格中的 URL 列表的种类(表单可以设置为允许每个单元格多张图片),设置权限,然后 return URLs 返回的列表,这次是 Google 在 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;
}

在我的例子中,由于 URLs 将构成电子邮件的消息正文,我的调用如下所示:

var message = AnyoneWithLinkCanView(dataSheet.getRange(lastr,i).getValue());