Попытка установить разрешения для "любой пользователь, имеющий ссылку, может просматривать" для файла, загруженного через раздел "загрузка файла" формы

Раздел "Загрузка файла" используется в форме: мне нужен пользователь формы (не владелец), чтобы иметь возможность поделиться файлом с кем-то, кроме владельца формы.

Похоже, что результаты загрузки файла в форме помещают файл на диск текущего пользователя формы и предоставляют URL-адрес, который может просмотреть владелец формы. Мне нужно, чтобы этот URL был доступен другим пользователям (через сценарий, а не вручную).

Мой сценарий запускается при вводе формы:

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

... где идентификатор получен из URL-адреса, предоставленного в форме (см. Самый простой способ получить идентификатор файла из URL-адреса в скрипте Служб Google... насколько я знаю, я правильно понял идентификатор).

Как просто пользователь со ссылкой на форму, я не получаю ошибок... и при этом я не вижу ошибок, вводимых в форму как владелец.

Но URL никто не может видеть, кроме владельца электронной таблицы (даже пользователь, который вошел в этот файл и владеет им, может просмотреть ссылку)... поэтому DriveApp.Access.ANYONE_WITH_LINK не работает. Не владельцы формы будут управлять этим. Я предполагаю, что setSharing запускается как владелец формы, а не как пользователь, и, следовательно, не может установить его для совместного использования? Есть ли способ для скрипта сделать файл / ссылку видимыми?

Но даже если владелец формы запускает форму, URL не может быть просмотрен другими. Я не думаю, что идентификатор меняется, когда файл становится разделяемым? Так что я должен неправильно вызывать setSharing?

Может быть, идентификатор в URL-адресе, предоставленном формой, представляет собой какую-то "пустую землю", где это не истинный идентификатор файла?

Пример подпрограммы, которая просто идет вниз по столбцу 4 электронной таблицы с этими 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(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 другому пользователю, и он получит ошибку прав доступа.

2 ответа

Это исправило это:

   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);
        }
      }
    }

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

... Я говорил это: нет разрешений никому со ссылкой! ПОСМОТРЕТЬ, это правильный вариант!

Вот функция, которая задает вид списка URL-адресов, который форма будет вставлять в ячейку (форма может быть настроена для разрешения нескольких изображений на ячейку), устанавливает разрешения и возвращает список URL-адресов обратно, на этот раз, когда Google форматирует URL в getURL():

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());

Входные данные формы запускаются как те, кто создает триггер формы. Если вы хотите, чтобы скрипт выполнялся как она, дайте ей доступ к скрипту и макросу, который создает триггер формы.

Другие вопросы по тегам