# WPS365 读取在线表格内容配置指南

## 概述

本指南详细说明如何配置WPS365应用，以实现读取自己创建的在线表格内容。

## 一、WPS365开放平台配置步骤

### 1. 应用基础配置

1. **登录WPS365开放平台**
   - 访问：https://open.wps.cn/
   - 使用WPS账号登录

2. **创建应用**
   - 进入"应用管理"
   - 点击"创建应用"
   - 填写应用名称（如：Jarvis同步WPS）
   - 选择应用类型：**服务端应用**

3. **获取应用凭证**
   - 记录 `AppID`（应用ID）
   - 记录 `AppKey`（应用密钥，注意保密）

### 2. 配置回调地址

1. **进入"开发配置" > "事件与回调"**
2. **配置回调地址**
   - 回调地址：`https://jarvis.van333.cn/wps365-callback`
   - 点击"验证"按钮，确保验证通过
   - 如果验证失败，检查：
     - 回调接口是否支持GET和POST请求
     - 是否能正确处理challenge参数
     - 前端白名单是否已配置

### 3. 配置权限（关键步骤）

#### 3.1 进入权限管理

1. 在左侧导航栏选择 **"开发配置" > "权限管理"**
2. 查看当前应用的权限列表

#### 3.2 添加必要权限

需要添加以下权限才能读取在线表格内容：

**基础权限：**
- ✅ `file.read` - 读取文件权限
- ✅ `file.readwrite` - 读取和写入文件权限（如果只需要读取，可以只选read）
- ✅ `user.info` - 获取用户信息权限

**在线表格（KSheet）权限：**
- ✅ `ksheet:read` - 读取在线表格数据
- ✅ `ksheet:write` - 写入在线表格数据（如果需要编辑功能）

**权限说明：**
- 这些权限决定了你的应用能访问哪些资源
- 用户授权时，会看到这些权限的说明
- 只有用户同意授权后，应用才能访问对应的资源

#### 3.3 权限申请流程

1. 在权限管理页面，点击"添加权限"
2. 搜索并选择上述权限
3. 提交权限申请（部分权限可能需要审核）
4. 等待审核通过

### 4. 应用能力配置（可选）

根据图片显示，WPS365开放平台提供了多种应用能力：

**协作与会话：**
- WPS协作机器人
- 工作台小组件
- WPS协作网页应用

**多维表格：**
- 记录卡片插件
- 字段插件
- 视图插件
- 仪表盘插件
- 数据连接器插件
- 自动化插件

**注意：**
- 如果只是读取在线表格内容，通常不需要开启这些插件能力
- 这些能力主要用于扩展表格功能，不是读取数据的必要条件
- 读取数据主要依赖API权限，而不是这些插件能力

## 二、后端配置

### 1. 更新配置文件

在 `application-dev.yml` 中添加配置：

```yaml
wps365:
  # 应用ID（从WPS365开放平台获取）
  app-id: YOUR_APP_ID
  # 应用密钥（从WPS365开放平台获取）
  app-key: YOUR_APP_KEY
  # 授权回调地址
  redirect-uri: https://jarvis.van333.cn/wps365-callback
  # API基础地址
  api-base-url: https://open.wps.cn/api/v1
  # OAuth授权地址
  oauth-url: https://open.wps.cn/oauth2/v1/authorize
  # 获取Token地址
  token-url: https://open.wps.cn/oauth2/v1/token
  # 刷新Token地址
  refresh-token-url: https://open.wps.cn/oauth2/v1/token
```

### 2. 确认授权范围（Scope）

当前代码中使用的授权范围：
```java
scope=file.readwrite,user.info
```

如果需要更细粒度的权限控制，可以修改为：
```java
scope=file.read,ksheet:read,user.info  // 只读权限
// 或
scope=file.readwrite,ksheet:readwrite,user.info  // 读写权限
```

## 三、使用流程

### 1. 用户授权

1. 调用 `/jarvis/wps365/authUrl` 获取授权URL
2. 用户访问授权URL，同意授权
3. WPS365回调到 `/wps365-callback`，自动保存Token

### 2. 获取文件列表

```javascript
// 调用接口获取文件列表
GET /jarvis/wps365/files?userId=xxx&page=1&pageSize=20
```

### 3. 获取工作表列表

```javascript
// 获取指定文件的工作表列表
GET /jarvis/wps365/sheets?userId=xxx&fileToken=xxx
```

### 4. 读取单元格数据

```javascript
// 读取指定范围的单元格数据
GET /jarvis/wps365/readCells?userId=xxx&fileToken=xxx&sheetIdx=0&range=A1:Z100
```

**参数说明：**
- `userId`: 用户ID（授权后获取）
- `fileToken`: 文件Token（从文件列表中获取）
- `sheetIdx`: 工作表索引（从0开始）
- `range`: 单元格范围（如：A1:Z100，可选，不填则读取整个工作表）

## 四、常见问题

### Q1: 提示"权限不足"或"无权限访问"

**解决方案：**
1. 检查WPS365开放平台的权限配置
2. 确认已添加 `file.read` 和 `ksheet:read` 权限
3. 重新授权（删除旧Token，重新获取授权）

### Q2: 无法读取自己创建的表格

**可能原因：**
1. 文件Token不正确
2. 工作表索引错误
3. 用户对文件没有读取权限（即使是自己创建的，也需要授权给应用）

**解决方案：**
1. 确认文件Token是从文件列表中正确获取的
2. 使用 `/jarvis/wps365/sheets` 接口确认工作表索引
3. 确保用户已授权应用访问该文件

### Q3: 读取返回空数据

**可能原因：**
1. 指定的单元格范围没有数据
2. 工作表索引错误
3. API返回格式与预期不符

**解决方案：**
1. 尝试读取更大的范围（如：A1:Z1000）
2. 检查工作表索引是否正确
3. 查看后端日志，确认API返回的具体内容

## 五、API接口说明

### 读取单元格数据接口

**接口地址：** `GET /jarvis/wps365/readCells`

**请求参数：**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| userId | String | 是 | 用户ID |
| fileToken | String | 是 | 文件Token |
| sheetIdx | Integer | 否 | 工作表索引，默认0 |
| range | String | 否 | 单元格范围，如：A1:B10 |

**返回示例：**
```json
{
  "code": 200,
  "msg": "读取单元格数据成功",
  "data": {
    "values": [
      ["列1", "列2", "列3"],
      ["数据1", "数据2", "数据3"],
      ["数据4", "数据5", "数据6"]
    ]
  }
}
```

## 六、完整示例

### 前端调用示例

```javascript
import { 
  getWPS365AuthUrl, 
  getWPS365FileList,
  getWPS365SheetList,
  readWPS365Cells 
} from '@/api/jarvis/wps365'

// 1. 获取授权URL
const authResponse = await getWPS365AuthUrl()
window.open(authResponse.data, '_blank')

// 2. 等待授权完成后，获取文件列表
const fileListResponse = await getWPS365FileList({
  userId: 'your_user_id',
  page: 1,
  pageSize: 20
})

// 3. 选择要读取的文件，获取工作表列表
const fileToken = fileListResponse.data.files[0].file_token
const sheetListResponse = await getWPS365SheetList('your_user_id', fileToken)

// 4. 读取第一个工作表的数据
const dataResponse = await readWPS365Cells({
  userId: 'your_user_id',
  fileToken: fileToken,
  sheetIdx: 0,
  range: 'A1:Z100'
})

console.log('表格数据：', dataResponse.data.values)
```

## 七、注意事项

1. **权限范围**：确保在WPS365开放平台配置了正确的权限
2. **文件Token**：使用fileToken而不是fileId来访问文件
3. **工作表索引**：工作表索引从0开始，不是从1开始
4. **单元格范围**：范围格式为 `A1:B10`，不区分大小写
5. **Token有效期**：Token会过期，需要定期刷新或重新授权
6. **数据量限制**：一次读取的数据量不要太大，建议分批读取

