如何用Office Excel Web Add-in脚本识别SharePoint Excel活跃用户并提示占用
1. 识别访问过SharePoint Excel文件的用户列表
Excel Web Add-in本身没有直接获取历史访问用户列表的原生API,这类审计数据属于SharePoint/Office 365的管理范畴,需结合以下方式实现:
- 获取共享授权用户:如果文件通过SharePoint共享,可调用SharePoint REST API获取所有被授权访问的用户:
// 示例:调用SharePoint REST API获取文件共享用户 function getSharedUsers(fileRelativeUrl) { const siteUrl = Office.context.document.url.split('/_layouts')[0]; const apiUrl = `${siteUrl}/_api/web/GetFileByServerRelativeUrl('${fileRelativeUrl}')/ListItemAllFields/SharedWithUsers`; Office.context.webRequestAsync( apiUrl, { method: 'GET', headers: { 'Accept': 'application/json;odata=nometadata' } }, function(result) { if (result.status === 200) { const sharedUsers = JSON.parse(result.response).value; console.log("共享用户列表:", sharedUsers.map(u => u.Title)); } else { console.error("获取共享用户失败:", result.error); } } ); } - 获取历史访问审计日志:要获取实际访问过文件的用户,需调用Microsoft Graph API审计日志接口(需管理员权限),筛选目标Excel文件的访问记录:
// 示例:调用Graph API获取审计日志(需提前获取Access Token) async function getAccessHistory(fileId) { const graphUrl = `https://graph.microsoft.com/v1.0/auditLogs/signIns?$filter=resourceId eq '${fileId}'`; const response = await fetch(graphUrl, { headers: { 'Authorization': `Bearer ${yourAccessToken}` } }); const logs = await response.json(); const uniqueUsers = [...new Set(logs.value.map(log => log.userDisplayName))]; console.log("历史访问用户:", uniqueUsers); }
2. 识别当前活跃的用户列表
Excel JavaScript API提供getActiveViewersAsync方法,可直接获取当前正在查看或编辑工作簿的所有用户:
function getActiveUsers() { Office.context.document.getActiveViewersAsync(function(asyncResult) { if (asyncResult.status === Office.AsyncResultStatus.Succeeded) { const activeUsers = asyncResult.value; // 每个用户对象包含displayName、email等属性 const userList = activeUsers.map(user => `${user.displayName} (${user.email})`).join(', '); console.log("当前活跃用户:", userList); } else { console.error("获取活跃用户失败:", asyncResult.error.message); } }); }
注意:该方法仅在Excel Online(SharePoint/OneDrive)环境下有效,桌面版Excel不支持。
3. 检测工作簿是否被占用并发出警告
结合getActiveViewersAsync方法判断活跃用户数量,再通过Office UI组件弹出警告:
function checkWorkbookOccupancy() { Office.context.document.getActiveViewersAsync(function(asyncResult) { if (asyncResult.status === Office.AsyncResultStatus.Succeeded) { const activeUsers = asyncResult.value; // 活跃用户数大于1,说明有其他用户在操作 if (activeUsers.length > 1) { // 方式1:系统警告框 alert("工作簿已被使用,请稍后再试!"); // 方式2:自定义对话框(需提前准备warning.html页面) /* Office.context.ui.displayDialogAsync( `${Office.context.addinSettings.get('add-in-base-url')}/warning.html`, { height: 250, width: 450, title: "工作簿占用提醒" }, function(dialogResult) { if (dialogResult.status === Office.AsyncResultStatus.Failed) { alert("工作簿已被使用,请稍后再试!"); } } ); */ } } else { console.error("无法检测工作簿状态:", asyncResult.error.message); } }); } // Add-in初始化时自动检测,可选定时轮询 Office.initialize = function(reason) { document.addEventListener('DOMContentLoaded', function() { checkWorkbookOccupancy(); // 每30秒轮询一次状态 setInterval(checkWorkbookOccupancy, 30000); }); };
提示:若需排除当前用户判断,可调用Graph API获取当前用户信息,再从活跃用户列表中剔除后统计剩余数量。
内容的提问来源于stack exchange,提问作者Thinesh T
相关产品推荐
相关产品推荐

