Я пытался следовать документации, но они не содержат рабочего примера использования этой функции.
Это моя реализация:
async function transferOwner( ){
const authClient = await authorize();
const realFileId = '***fileId***';
const newOwnerEmail = '@gmail.com';
try{
const drive = google.drive({version: 'v3', auth: authClient});
const res = await drive.permissions.update({
fileId: realFileId,
permissionId: '***permission id that i found somehow***',
transferOwnership: true,
sendNotificationEmail: true,
email: newOwnerEmail,
"resource": {
"role": "owner"
}
});
console.info(result);
console.info(`transfered ownership to ${newOwnerEmail}`);
return result;
} catch (err){
console.info(`could not transfer ownership to ${newOwnerEmail}`);
console.info(err);
throw err
}
}
Когда я выполняю этот код, я получаю код состояния 200, но я не вижу, чтобы на моем диске менялся какой-либо владелец.
Что я делаю не так?
Это разрешение, если оно необходимо. Хотя мне пришлось удалить часть ответа, поскольку stackoverflow не позволял легко публиковать такой большой контент.
{ заголовки: {заголовки}, статус: 200, statusText: 'ОК', запрос: { URL-адрес ответа: 'https://www.googleapis.com/drive/v3/files/RrBv4BK1yby5D/permissions/253029680?transferOwnership=true&sendNotificationEmail=true&email=%40gmail.com' }` передал право собственности @gmail.com
Добавил * в места, где пытался скрыть какую-либо информацию.
Я пробовал много способов сменить владельца с помощью моего кода, но ничего не помогло.
Каждый раз я получаю сообщение об успехе и код состояния 200, но на диске ничего не отображается.
Проверьте свою электронную почту, я думаю, новый владелец должен ее принять.
Я проверил, никто не получил никаких писем. Я попробую этот формат, хотя думаю, что, возможно, уже пробовал его раньше, когда пробовал все возможные комбинации, но давайте посмотрим
Я попробовал упомянутый формат и вот что получил код: 403, ошибки: [{ сообщение: «Тело ресурса включает поля, которые не доступны для прямой записи.», домен: «глобальный», причина: «fieldNotWritable» }], но когда я удаляю адрес электронной почты из тела запроса, я получаю успех, но, как и в прошлый раз, файл не передается
По поводу вашей ситуации у меня 3 вопроса. 1. Какой mimeType целевого файла? 2. Кто является владельцем текущего целевого файла? 3. От чего появляется authClient
? Он извлекается из OAuth2 текущей учетной записи владельца? Или он извлекается из учетной записи службы?
mimeType, я не уверен, но файлы в формате JSON. Учетная запись, которую я использую для передачи файла, и из той же учетной записи создается служба API. authclient передается из функции авторизации. Используя тот же механизм аутентификации, я могу загружать, удалять и скачивать файлы, так что это определенно не проблема с авторизацией или, конечно, не проблема с mimetype.
@Tanaike, смог ли я объяснить тебе свою проблему?
Спасибо за ответ. Что касается @Tanaike was I able to explain you my issue?
, я должен извиниться за поздний ответ. Теперь я заметил из вашего ответа. Когда вы отвечаете на комментарий и ставите @username
, пользователь может заметить ваш ответ. Теперь я заметил, что ваш вопрос решен. Я рад этому.
@Tanaike, я вижу, просмотрю отчет об ошибке, чтобы лучше понять, но я полагаю, что это должно помочь. спасибо и за вашу помощь
@Tanaike Редактировать 1: - нет, это не совсем решает мою проблему. Мой ответ приходит как 200, но ничего не происходит, хотя в ответе конкретно указана ошибка 403.
@Никхил Чоудхари Спасибо за ответ. Судя по вашему ответу, когда я снова увидел ваш ответ, я подумал, что смогу предложить обходной путь. Итак, я разместил это как ответ. Пожалуйста, подтвердите это. Если это не помогло в вашей ситуации, прошу прощения.
@Tanaike да, твой обходной путь мне очень помог. Это просто последняя проблема с уведомлением, которая мешает мне реализовать ее. Хотя не стоит извиняться.
После долгих поисков нашел это в Google bugtracker.
В настоящее время Диск не поддерживает изменение владельца элементов, принадлежащих учетным записям gmail.com; он поддерживается для учетных записей Workspace. - 12 апреля 2022 г., 12:44 здесь
это хороший прогресс, но моя проблема все еще немного другая. Если бы я мог получить тот же ответ, например: «403: {код: 403, сообщение: «Требуется согласие для передачи права собственности на файл другому....» Я бы посчитал это таковым, но мой ответ другой
@Nikhilchoudhary, это потому, что вы ничего не обновляете и получаете 200 ответов от Google. Причина в том, что sendNotificationEmail
, email
и resource
не являются допустимыми параметрами и полностью игнорируются библиотекой, поэтому фактически ничего не делают.
На текущем этапе, когда передается владелец файла потребительской учетной записи (gmai.com), необходимо выполнить 2 шага. Ссылка Когда я раньше тестировал это с помощью следующего скрипта, целевая учетная запись получила электронное письмо для передачи владельца.
const newOwnerEmail = "###@gmail.com";
const fileId = "###";
const drive = google.drive({version: 'v3', auth: authClient});
const res = await drive.permissions.create({
fileId: fileId,
sendNotificationEmail: true,
supportsAllDrives: true,
requestBody: {
role: "writer",
type: "user",
pendingOwner: true,
emailAddress: newOwnerEmail,
},
});
Теперь, когда я это проверил, к сожалению, электронное письмо не отправляется, а также значение pendingOwner
не меняется на true
. Держится false
. Из-за этого я заметил, что передать владельца с помощью приведенного выше скрипта невозможно. Я не уверен, является ли это текущей спецификацией или ошибкой.
К счастью, я заметил, что при обновлении существующего разрешения значение pendingOwner
можно изменить на true
. Таким образом, целевой пользователь может принять передачу владельца. В этом ответе в качестве текущего обходного пути я хотел бы предложить пример сценария для достижения этого потока.
Пример сценария выглядит следующим образом.
const newOwnerEmail = "###@gmail.com";
const fileId = "###";
const drive = google.drive({version: 'v3', auth: authClient});
const res1 = await drive.permissions.list({
fileId,
supportsAllDrives: true,
pageSize: 100,
fields: "*",
});
const permission = res1.data.permissions.find(
({ emailAddress }) => emailAddress == newOwnerEmail
);
let permissionId = "";
if (permission) {
permissionId = permission.id;
} else {
const { data: { id } } = await drive.permissions.create({
fileId: fileId,
sendNotificationEmail: true,
supportsAllDrives: true,
requestBody: {
role: "writer",
type: "user",
pendingOwner: true, // It seems that this cannot be used. This might be a bug.
emailAddress: newOwnerEmail,
},
});
permissionId = id;
}
const res2 = await drive.permissions.update({
fileId,
permissionId,
supportsAllDrives: true,
requestBody: {
role: "writer",
pendingOwner: true,
},
});
console.info(res2.data);
pendingOwner
обновляется путем обновления разрешения с помощью идентификатора разрешения. В этом потоке, когда целевой пользователь подтверждает разрешение файла, пользователь может подтвердить «Принять владение?» следующее. Когда пользователь принимает это, владелец файла передается пользователю.Итак, это работает, и в учетной записи старого владельца я вижу, что есть ожидающий владелец, но для учетной записи нового владельца я не могу найти папку. Как принять это право собственности в качестве нового владельца?
@Nikhil choudhary Спасибо за ответ и тестирование. Я рад, что этот обходной путь полезен. И тебе спасибо. Кстати, к будущему обновлению верхний скрипт в моем ответе, возможно, можно будет использовать снова, потому что верхний скрипт можно было использовать раньше.
попробуйте использовать опцию
requestBody
вместоresource
, вот такrequestBody: { emailAddress: newOwnerEmail, role: 'owner' }