我有一个链接到 Google Sheet 的 AppScript。该表看起来像这样:
链接 | 元数据 |
---|---|
https://docs.google.com/document/d/1 | Lorem ipsum |
https://docs.google.com/document/d/2 | Lorem ipsum |
在 A 列中,我有所有链接到 Google 文档文件(工作表、幻灯片、文档等)的 URL。在后续的一些列中,我有使用应用程序脚本检索的那些文件的元数据,例如文档的创建者/所有者、最近的编辑等。
AppScript 权限与我的用户帐户绑定。我的用户帐户是 GSuite 组织的一部分。列表中的所有文档都具有“组织中的任何人都可以查看/评论/编辑”的权限。我可以亲自打开并至少查看(如果不是更多)该列表中的每个文档,因为我的用户是组织的一部分(我打开它们进行检查)。
但是,对于某些 URL,我收到以下错误:
GoogleJsonResponseException: API call to drive.revisions.list failed with error: The authenticated user does not have the required access to the file
尽管事实上我可以使用我的用户帐户打开 URL。
我确保包含“https://www.googleapis.com/auth/drive”范围,并启用云端硬盘服务。
我见过这个线程有同样的错误,但上下文不同。就我而言,我检查了各个文件的权限,并且我的用户具有访问这些文件的权限。
我不知道还有什么可能导致这个问题。感谢任何指点!
这是当前的AppScript代码供参考(忽略它不是很好的代码,目前专注于使其工作):
function getData() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("OVERVIEW");
const lastRow = sheet.getLastRow();
const range = sheet.getRange("A2:A" + lastRow);
for (var i = 0; i < lastRow - 1; i++) {
const cell = range.getCell(i + 1, 1);
const value = cell.getValue();
const row = i + 2;
if (value.toString() != "") {
const id = value.split("/")[5];
if (id) {
// Initialize variables to store values
let title, owner, lastEditDate, lastEditorEmail, lastCommentDate, lastCommentAuthor;
try {
let file;
try {
file = DriveApp.getFileById(id);
} catch (error) {
// Handle the error, for example:
Logger.log("Error fetching file for row " + row + ": " + error);
continue; // Skip to the next iteration to process the next row
}
// Title
title = file.getName();
// Owner
try {
owner = file.getOwner().getEmail();
} catch (error) {
owner = "";
}
// Last edit
const revisionsList = Drive.Revisions.list(id);
if (revisionsList && revisionsList.items.length > 0) {
revisionsList.items.sort(function(a, b) {
return new Date(b.modifiedDate) - new Date(a.modifiedDate);
});
lastEditDate = revisionsList.items[0].modifiedDate;
lastEditorEmail = revisionsList.items[0].lastModifyingUser.emailAddress;
}
// Last commented on
const commentsList = Drive.Comments.list(id).items;
if (commentsList && commentsList.length > 0) {
commentsList.sort(function(a, b) {
return new Date(b.createdDate) - new Date(a.createdDate);
});
lastCommentDate = commentsList[0].createdDate;
const formattedLastCommentDate = Utilities.formatDate(new Date(lastCommentDate), "GMT+1", 'dd/MM/yyyy');
lastCommentDate = formattedLastCommentDate;
lastCommentAuthor = commentsList[0].author.displayName;
}
// Format Last Edit Date in DD/MM/YYYY format
if (lastEditDate) {
const formattedLastEditDate = Utilities.formatDate(new Date(lastEditDate), "GMT+1", 'dd/MM/yyyy');
lastEditDate = formattedLastEditDate;
}
} catch (error) {
// Handle error for inaccessible file or other exceptions
Logger.log("Error fetching data for row " + row + ": " + error);
}
// Set values in the row, only if they were retrieved successfully
sheet.getRange(row, 5).setValue(title || null);
sheet.getRange(row, 9).setValue(owner || null);
sheet.getRange(row, 10).setValue(lastEditDate || null);
sheet.getRange(row, 11).setValue(lastEditorEmail || null);
sheet.getRange(row, 12).setValue(lastCommentDate || null);
sheet.getRange(row, 13).setValue(lastCommentAuthor || null);
}
}
}
}