Попытка установить разрешения для «любой пользователь, имеющий ссылку, может просматривать» для файла, загруженного через раздел «загрузка файла» формы - PullRequest
0 голосов
/ 27 февраля 2019

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

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

При запуске с помощью ввода формы мой скрипт запускается:

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

... где id - этополучено из 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 ]

0 голосов
/ 28 февраля 2019

Это исправлено:

   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

... Я говорил это: ни у кого нет разрешений со ссылкой!VIEW, это правильный вариант!

Вот функция, которая при заданном виде списка 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());
0 голосов
/ 27 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...