Google Photos API脚本无法获取所有指定相册元数据的排查求助
解决Google Apps Script批量获取Google Photos相册元数据不完整的问题
针对500+相册场景下仅能获取部分元数据的问题,可从以下几个方向排查并解决:
1. API调用配额与速率限制
Google Photos API存在调用配额限制,高频批量请求容易触发限流,导致部分请求失败。
- 检查Google Cloud Console中Photos Library API的配额使用情况,确认是否超限;
- 在API调用之间添加间隔,例如
Utilities.sleep(500)(毫秒),避免短时间内发起过多请求; - 若配额不足,可在Cloud Console申请配额提升。
2. 相册匹配逻辑缺陷
Sheet中的相册名称与Google Photos中的实际名称可能存在大小写、空格、特殊字符差异,导致匹配失败。
- 统一名称匹配规则,例如将两者都转为小写并去除首尾空格后再对比:
album.title.toLowerCase().trim() === targetName.toLowerCase().trim(); - 改用相册ID而非名称进行查询,完全避免名称歧义(可先批量导出所有相册ID与名称的对应关系到Sheet,再基于ID查询元数据)。
3. 未处理API分页
Google Photos API的albums.list接口默认每页返回20个相册,超过该数量的相册需要通过nextPageToken分页获取,未处理分页会直接漏掉后续相册。
优化后的分页获取逻辑示例:
function getAllAlbums() { let allAlbums = []; let pageToken = null; do { const response = PhotosLibrary.Albums.list({ pageToken: pageToken, pageSize: 50 // 最大支持每页50个相册 }); if (response.albums) allAlbums = allAlbums.concat(response.albums); pageToken = response.nextPageToken; Utilities.sleep(500); // 间隔避免限流 } while (pageToken); return allAlbums; }
4. 权限范围不足
脚本的OAuth权限可能未覆盖所有目标相册(例如仅允许访问当前账号创建的相册,无法读取共享相册)。
- 确认脚本的OAuth scopes包含
https://www.googleapis.com/auth/photoslibrary.readonly或更全面的权限; - 检查所有目标相册是否为当前授权账号可访问状态(包括共享相册的权限设置)。
5. 脚本执行超时
Google Apps Script单次执行最长限制为6分钟,处理500+相册时容易超时中断。
- 拆分任务,使用时间驱动触发器分批处理(例如每次处理100个相册);
- 优化代码逻辑:先一次性获取所有相册数据,再与Sheet中的列表匹配,避免重复发起API请求。
完整优化脚本示例
function fetchAlbumMetadata() { const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 读取Sheet中的相册名称列表(假设第一列为名称,从第二行开始) const albumNameList = sheet.getRange(2, 1, sheet.getLastRow() - 1, 1).getValues().flat(); // 批量获取所有相册(处理分页) const allAlbums = getAllAlbums(); // 匹配并写入元数据到Sheet(第二列ID、第三列媒体数量、第四列创建时间) albumNameList.forEach((targetName, rowIndex) => { const matchedAlbum = allAlbums.find(album => album.title.toLowerCase().trim() === targetName.toLowerCase().trim() ); const currentRow = rowIndex + 2; if (matchedAlbum) { sheet.getRange(currentRow, 2).setValue(matchedAlbum.id); sheet.getRange(currentRow, 3).setValue(matchedAlbum.mediaItemsCount); sheet.getRange(currentRow, 4).setValue(new Date(matchedAlbum.creationTime)); } else { sheet.getRange(currentRow, 2).setValue("未找到匹配相册"); } Utilities.sleep(300); // 避免Sheet写入过快 }); } // 分页获取所有相册的辅助函数 function getAllAlbums() { let allAlbums = []; let pageToken = null; do { const response = PhotosLibrary.Albums.list({ pageToken: pageToken, pageSize: 50 }); if (response.albums) allAlbums = allAlbums.concat(response.albums); pageToken = response.nextPageToken; Utilities.sleep(500); } while (pageToken); return allAlbums; }
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

