在Google Apps Script中列出共享云端硬盘权限时多个字段显示undefined
问题:Google Apps Script获取共享云端硬盘权限时多个字段显示undefined
我尝试用Google Apps Script列出共享云端硬盘的权限,但运行代码后,DisplayName、EmailAddress等多个权限字段显示为undefined。以下是我的代码及运行输出:
function listAllSharedDrives() { let pageToken = null; let page; let pageperm; let contador=0; let idunidad; Logger.clear(); //do { page = Drive.Drives.list({ pageSize: 1, pageToken: pageToken, q: 'memberCount = 1', //fields在Drive API v3中未被文档记录,但它是避免字段为undefined所必需的 fields: 'nextPageToken, drives(id, name, createdTime)', useDomainAdminAccess: true }); const drives = page.drives; if (drives) // 打印云端硬盘名称 for (const drive of drives) { contador+=1; console.log('Id: %s Nombre: %s Creado en: %s', drive.id, drive.name, drive.createdTime); pageperm = Drive.Permissions.list (drive.id,{ supportsAllDrives: true, useDomainAdminAccess: true }) const lospermisos = pageperm.permissions; if (lospermisos) for (const mipermiso of lospermisos) { console.log('Permiso ID: %s\nDisplayName: %s\nTipo: %s\nKind: %s\nRole: %s\nEmail: %s\nDominio: %s\nExpirationTime: %s\nDeleted: %s\nView: %s\nPendingOwner: %s',mipermiso.id,mipermiso.displayName,mipermiso.type,mipermiso.kind,mipermiso.role,mipermiso.emailAddress,mipermiso.domain,mipermiso.expirationTime,mipermiso.deleted,mipermiso.view,mipermiso.pendingOwner); if (mipermiso.PermissionDetails) for (const detalle of mipermiso.PermissionDetails) { console.log('Detalle permissionType: %s inheritedFrom: %s Role: %s Inherited: %s',detalle.PermissionType,detalle.inheritedFrom,detalle.role,detalle.inherited) } } console.log(''); } // pageToken = page.nextPageToken; //} while (pageToken); console.log('Total de unidades compartidas %d',contador); }
运行输出:
信息 Id: 0APeuZG... Nombre: UAL Creado en: 2024-01-15T10:33:37.635Z
信息 Permiso ID: 156621468...
DisplayName: undefined
Tipo: user
Kind: drive#permission
Role: organizer
Email: undefined
Dominio: undefined
ExpirationTime: undefined
Deleted: undefined
View: undefined
PendingOwner: undefined
问题原因及修复方案
1. 未指定fields参数
Drive API v3默认只返回权限对象的核心字段(如id、type、kind、role),displayName、emailAddress等非核心字段需要显式通过fields参数指定才能返回。
2. 字段名大小写错误
API返回的字段采用小驼峰命名规则(如permissionDetails、permissionType),但代码中错误使用了大驼峰写法,导致无法读取对应字段值。
修改后的代码
function listAllSharedDrives() { let pageToken = null; let page; let pageperm; let contador=0; let idunidad; Logger.clear(); //do { page = Drive.Drives.list({ pageSize: 1, pageToken: pageToken, q: 'memberCount = 1', fields: 'nextPageToken, drives(id, name, createdTime)', useDomainAdminAccess: true }); const drives = page.drives; if (drives) for (const drive of drives) { contador+=1; console.log('Id: %s Nombre: %s Creado en: %s', drive.id, drive.name, drive.createdTime); // 添加fields参数,指定所有需要获取的权限字段 pageperm = Drive.Permissions.list (drive.id,{ supportsAllDrives: true, useDomainAdminAccess: true, fields: 'permissions(id, displayName, type, kind, role, emailAddress, domain, expirationTime, deleted, view, pendingOwner, permissionDetails(permissionType, inheritedFrom, role, inherited))' }) const lospermisos = pageperm.permissions; if (lospermisos) for (const mipermiso of lospermisos) { console.log('Permiso ID: %s\nDisplayName: %s\nTipo: %s\nKind: %s\nRole: %s\nEmail: %s\nDominio: %s\nExpirationTime: %s\nDeleted: %s\nView: %s\nPendingOwner: %s',mipermiso.id,mipermiso.displayName,mipermiso.type,mipermiso.kind,mipermiso.role,mipermiso.emailAddress,mipermiso.domain,mipermiso.expirationTime,mipermiso.deleted,mipermiso.view,mipermiso.pendingOwner); // 修正字段名为小驼峰permissionDetails if (mipermiso.permissionDetails) for (const detalle of mipermiso.permissionDetails) { // 修正字段名为小驼峰permissionType console.log('Detalle permissionType: %s inheritedFrom: %s Role: %s Inherited: %s',detalle.permissionType,detalle.inheritedFrom,detalle.role,detalle.inherited) } } console.log(''); } // pageToken = page.nextPageToken; //} while (pageToken); console.log('Total de unidades compartidas %d',contador); }
说明
- 通过
fields参数明确指定需要返回的所有权限字段,确保API返回完整数据 - 修正字段名的大小写错误,保证能正确读取API返回的属性值
内容的提问来源于stack exchange,提问作者Antonio Casado
相关产品推荐
相关产品推荐

