UNPKG

feishub

Version:

A TypeScript SDK for Feishu (Lark) multi-dimensional tables

190 lines 6.9 kB
import { config } from "dotenv"; import { Feishu } from "./Feishu.js"; // 加载环境变量 config(); /** * 使用FeishuTable 需要确认提供 appId、appSecret、appToken、 tableId */ export class Table { appToken; tableId; client; constructor({ appToken, tableId, feishu, } = {}) { /** * 初始化飞书表格客户端 * * @param appToken - 多维表格的 FEISHU_APP_TOKEN,如果不提供则从环境变量获取 * @param tableId - 表格的 FEISHU_TABLE_ID,如果不提供则从环境变量获取 * @param appId - 飞书应用的 FEISHU_APP_ID,如果不提供则从环境变量获取 * @param appSecret - 飞书应用的 FEISHU_APP_SECRET,如果不提供则从环境变量获取 */ this.appToken = appToken || process.env.FEISHU_APP_TOKEN || ""; this.tableId = tableId || process.env.FEISHU_TABLE_ID || ""; this.client = feishu || new Feishu({ appId: process.env.FEISHU_APP_ID || "", appSecret: process.env.FEISHU_APP_SECRET || "", }); // 确保客户端创建成功 if (!this.client) { throw new Error("客户端创建失败"); } } /** * 插入记录 * * @param fields - 要插入的字段数据 * @returns 成功返回记录数据,失败返回 null */ async insert(fields) { try { const response = await this.client.query(`https://open.feishu.cn/open-apis/bitable/v1/apps/${this.appToken}/tables/${this.tableId}/records`, "POST", { fields, }); if (response.code !== 0) { console.error(`插入记录失败, code: ${response.code}, msg: ${response.msg}`); return null; } return response.data?.record || null; } catch (error) { console.error(`插入记录时发生异常: ${error}`); return null; } } /** * 删除记录 * * @param recordId - 要删除的记录 ID * @returns 成功返回 true,失败返回 false */ async delete(recordId) { try { const response = await this.client.query(`https://open.feishu.cn/open-apis/bitable/v1/apps/${this.appToken}/tables/${this.tableId}/records/${recordId}`, "DELETE", {}); if (response.code !== 0) { console.error(`删除记录失败, code: ${response.code}, msg: ${response.msg}`); return false; } return true; } catch (error) { console.error(`删除记录时发生异常: ${error}`); return false; } } /** * 获取多维表格元数据 * * @returns 成功返回表格元数据,失败返回 null */ async meta() { try { const response = await this.client.query(`https://open.feishu.cn/open-apis/bitable/v1/apps/${this.appToken}`, "GET", {}); if (response.code !== 0) { console.error(`获取表格元数据失败, code: ${response.code}, msg: ${response.msg}`); return null; } return response.data?.app || null; } catch (error) { console.error(`获取表格元数据时发生异常: ${error}`); return null; } } /** * 搜索记录 * * @param options - 搜索选项 * @returns 成功返回搜索结果,失败返回 null */ async search(options = {}) { try { let url = `https://open.feishu.cn/open-apis/bitable/v1/apps/${this.appToken}/tables/${this.tableId}/records/search`; url += `?page_size=${options.page?.page_size || 20}`; if (options.page?.page_token) { url += `&page_token=${options.page.page_token}`; } const response = await this.client.query(url, "POST", { filter: options.filter, sort: options.sort, }); if (response.code !== 0) { console.error(`搜索记录失败, code: ${response.code}, msg: ${response.msg}`); return null; } return { items: response.data?.items || [], page_token: response.data?.page_token, has_more: response.data?.has_more, }; } catch (error) { console.error(`搜索记录时发生异常: ${error}`); return null; } } async iterate(options = {}, callback) { let page_token = options.page?.page_token; const page_size = options.page?.page_size; while (true) { const result = await this.search({ ...options, page: { page_token, page_size }, }); if (!result?.items) { break; } if (result.items.length) { await callback(result.items); } page_token = result.page_token; if (!result.has_more || !result.page_token) { break; } } } /** * 列出多维表格的所有字段 * * @returns 成功返回字段列表,失败返回 null */ async fields() { try { const response = await this.client.query(`https://open.feishu.cn/open-apis/bitable/v1/apps/${this.appToken}/tables/${this.tableId}/fields`, "GET", {}); if (response.code !== 0) { console.error(`获取字段列表失败, code: ${response.code}, msg: ${response.msg}`); return null; } return response.data?.items || []; } catch (error) { console.error(`获取字段列表时发生异常: ${error}`); return null; } } /** * 更新记录 * * @param recordId - 要更新的记录 ID * @param fields - 要更新的字段数据 * @returns 成功返回更新后的记录数据,失败返回 null */ async update(recordId, fields) { try { const response = await this.client.query(`https://open.feishu.cn/open-apis/bitable/v1/apps/${this.appToken}/tables/${this.tableId}/records/${recordId}`, "PUT", { fields, }); if (response.code !== 0) { console.error(`更新记录失败, code: ${response.code}, msg: ${response.msg}, data: ${JSON.stringify(response)}`); return null; } return response.data?.record || null; } catch (error) { console.error(`更新记录时发生异常: ${error}`); return null; } } } //# sourceMappingURL=Table.js.map