对drive.revisions.list的API调用访问权限失败(GoogleJsonResponseException)

问题描述 投票:0回答:0

我有一个链接到 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);
            }
        }
    }
}
javascript google-apps-script google-sheets google-drive-api
© www.soinside.com 2019 - 2024. All rights reserved.