Попытка установить разрешения для "любой пользователь, имеющий ссылку, может просматривать" для файла, загруженного через раздел "загрузка файла" формы
Раздел "Загрузка файла" используется в форме: мне нужен пользователь формы (не владелец), чтобы иметь возможность поделиться файлом с кем-то, кроме владельца формы.
Похоже, что результаты загрузки файла в форме помещают файл на диск текущего пользователя формы и предоставляют 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());
Входные данные формы запускаются как те, кто создает триггер формы. Если вы хотите, чтобы скрипт выполнялся как она, дайте ей доступ к скрипту и макросу, который создает триггер формы.