You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Office Excel Web Add-in脚本识别SharePoint Excel活跃用户并提示占用

SharePoint Excel Web Add-in 用户操作检测方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:40:16