У меня есть файл Google, содержащий записи; в частности, столбец A содержит URL-адрес, которым я хочу поделиться с получателями, которых я ввожу в столбцы B и C. Я хочу поместить этих получателей в редактор соответствующего URL-адреса, но без отправки уведомления.
Я пробую этот код:
function partagerFichiers() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Feuille 1");
let data = sheet.getDataRange().getValues();
let fichierUrl, destinataireEd1, destinataireEd2, destinataireCom, destinataireLec;
for (i=1;i<=data.length;i++) {
if (data[i].length > 1 && data[i][0] !== "") { //on récupère la 1ère colonne
fichierUrl = data[i][0];}
if (data[i].length > 1 && data[i][2] !== "") {
destinataireEd1 = data[i][2].split(";").map(function(item) { return item.trim(); });} //on récupère la 3ème colonne
if (data[i].length > 1 && data[i][3] !== "") {
destinataireEd2 = data[i][3].split(";").map(function(item) { return item.trim(); });} //on récupère la 4ème colonne
try {
let fichierId = fichierUrl.replace(/.*/d//, '').replace(//.*/, '');
let fichier = DriveApp.getFileById(fichierId);
destinataireEd1.forEach(function(mail) { fichier.addEditor(mail); });
destinataireEd1.forEach(destinataireEd1 => {
Drive.Permissions.create({ role: "writer", type: "user", emailAddress: destinataireEd1 }, fichier, { sendNotificationEmail: false });});
destinataireEd2.forEach(function(mail) { fichier.addEditor(mail); });
} catch (error) {
Logger.log("Erreur lors de la récupération du fichier pour l'url: " + fichierUrl);
Logger.log("Erreur :" + error.message);
}
}
}
Но я получаю несколько ошибок: «Ошибка: диск не определен» и «Ошибка: неверный аргумент: разрешение.значение» (последняя, я думаю, связана с тем, что у меня нет обратного адреса для определенных записей)
Спасибо
@Купер, ну нет, признаюсь, я даже не совсем понимаю, что это значит.
Это означает, что Drive
в вашем проекте не определен.
То есть я не могу использовать его без учетной записи Google?
Я не думаю, что вы можете запустить любой скрипт приложений Google без учетной записи Google.
В этом случае, если вы хотите включить Drive API, вам придется сделать его проектом GCP. Посмотрите в разделе передач вашего редактора скриптов.
Скрипт работает, если я удалю строку «Drive.Permissions.create({ role: «writer», type: «user», emailAddress: ReceiverEd1 }, file, { sendNotificationEmail: false });});'
Есть разница между проектом GCP и учетной записью Google.
Похоже, что метод file.addEditor(mail) в вашем скрипте выполняет ту же задачу, что и ваш Drive.Permissions.create
( который является одним из методов Drive API Advanced Google), предоставляя редактору доступ к указанным адресам электронной почты, поэтому нет необходимости использовать эту строку кода. Кроме того, просто для подтверждения: вы намерены предоставить доступ к редактору только для каждого идентификатора файла без отправки уведомлений по электронной почте, верно?
@SputnikDrunk2 Да, верно: я хочу предоставить только доступ к редактированию для каждого идентификатора файла без отправки уведомлений по электронной почте.
Если вы хотите поделиться файлами с получателями, не получая от них уведомлений по электронной почте, вы можете сделать это с помощью Advanced Drive Service Drive API для скрипта Google Apps. Вы на правильном пути, если используете Drive.Permissions.create
. Кроме того, я изменил ваш существующий сценарий, чтобы сделать его более читабельным и эффективным, используя меньше циклов for и условных операторов if.
Для начала вам нужно будет включить расширенные службы Drive API в редакторе сценариев приложений (это исправляет Error: Drive is not defined
), как показано ниже:
Примечание. Если при использовании этого примера сценария у вас возникнут проблемы с реальным файлом электронной таблицы, мы будем очень признательны, если вы предоставите образец листа со своей стороны, чтобы мы могли лучше воспроизвести вашу настройку.
function shareFiles() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Feuille 1");
let data = sheet.getDataRange().getValues();
const dataToBeProcessed = data.map((row, i) => {
return i != 0 && row.map(cell => {
try {
return new RegExp("d/(.*)/", "gm").exec(cell)[1]; //extract file ID from the link
} catch {
return cell.trim().split(";") //split email addresses for recipient 1 / recipient 2
}
})
}).filter(x => x); //filter non-important values
//Process sheet file data
dataToBeProcessed.forEach(data => {
let fileId = data[0];
let setRole = 'reader'; //Set the role here.
try {
data[1].forEach(editor1Recipient => {
editor1Recipient != '' && (setRole == 'writer' ? setAsWriter(setRole, editor1Recipient, fileId) : setAsReader(setRole, editor1Recipient, fileId), console.info(`Successfully shared file ID: (${fileId}) to ${editor1Recipient} with a "${setRole}" role.`))
});
data[2].forEach(editor2Recipient => {
editor2Recipient != '' && (setRole == 'writer' ? setAsWriter(setRole, editor2Recipient, fileId) : setAsReader(setRole, editor2Recipient, fileId), console.info(`Successfully shared file ID: (${fileId}) to ${editor2Recipient} with a "${setRole}" role.`));
});
} catch (e) {
console.info('Encountered an error: \n' + e)
}
})
}
/** Update the file permissions based on 'fileId' for users who have previously been set as 'writers'. */
function setAsReader(setRole, recipient, fileId) {
//Get the permissions from the file.
try {
const pullPermissions = () => {
return Drive.Permissions.list(fileId).permissions.filter(res => res.type == 'user' && res.role != 'owner');
}
const result = pullPermissions().map(permission => Drive.Permissions.update({
role: "reader"
}, fileId, permission.id));
console.info(result); //For backtracking purposes of this log, this contains the number of user shared permssions existing in the file that have been updated.
} catch {//If there are no existing permission for the file with 'reader' privilege, create a 'reader' role for the file.
setAsWriter(setRole, recipient, fileId);
}
}
function setAsWriter(setRole, recipient, fileId){
Drive.Permissions.create({ role: setRole, type: "user", emailAddress: recipient }, fileId, { sendNotificationEmail: true });
}
Образец файла листа:
Пример результата журнала:
Вторая ссылка (идентификатор файла: 1ZR_xvSQG_z-Ow7CKyKM82NEuGIEAYW2y) не была обработана из-за пустых ячеек получателя.
Пример файла (идентификатор файла: 1e6FO9UNX92VYuZVIzyUQ_MClLwc8tMAb):
Спасибо за ваш ответ, но когда я запускаю сценарий, ничего не происходит (включая его изменение для просмотра уведомлений: тогда я не получаю никаких уведомлений). Также отмечу, что некоторые ячейки могут не содержать адрес электронной почты. Мой файл: docs.google.com/spreadsheets/d/…
Понятно. Я обновил свой сценарий и протестировал его на вашем образце. Надеюсь, поможет. Просто дайте мне знать, если у вас есть дополнительные вопросы.
Все работает отлично: спасибо! И последний вопрос по этой теме: я тестировал возможность делиться адресами электронной почты с помощью «комментариев» или «читателей», что тоже работает. Единственная проблема в том, что если я во-первых поставлю адрес в редакторе, если во-вторых передам его "комментатору" или "читателю", то это не работает, он останется в редакторе. Как я могу сделать ?
Пожалуйста. Я обновил пример сценария, добавив функцию с именем setAsReader, и вы можете передать fileId
в качестве параметра. Эта функция использует Drive.Permissions.update
для обновления прав доступа к файлу от записи к читателю. Для работы он использует идентификатор файла и идентификатор разрешения (который будет автоматически собран внутри функции). Вы можете поместить эту функцию внутри dataToBeProcessed
и заменить исходный метод Drive.Permissions.create
для тестирования.
Я не понял, как мне следует/можно использовать новую функцию setAsReader.
Позвольте мне обновить эту часть.
Обновлен пример сценария: в методе dataToBeProcessed
есть переменная setRole
, в которой вы можете указать, хотите ли вы роль читателя или писателя. Это определит, добавит ли сценарий разрешение получателя в качестве чтения/записи или обновит существующего получателя исходным разрешением «записывающего» для «читателя» с помощью функции setAsReader
.
Я получаю сообщение об ошибке: «Обнаружена ошибка: GoogleJsonResponseException: вызов API для диска.permissions.create завершился ошибкой: неверный запрос. Сообщение пользователя: «К сожалению, у вас нет разрешения на общий доступ». Когда я смотрю на файл, который мне нужен. чтобы поделиться, я понимаю, что все люди, которым изначально был предоставлен общий доступ, удалены (затем он открывается только для чтения) -> Я предполагаю, что это потому, что я не являюсь владельцем файла (я работаю над файлом, которым я не являюсь) владелец; и когда я создаю файл и запускаю скрипт, он работает нормально)
Это верно, поскольку вы не являетесь владельцем этих файлов, запуск сценария приведет к ошибке.
Включили ли вы Drive API в облачной консоли?