feishub
Version:
A TypeScript SDK for Feishu (Lark) multi-dimensional tables
190 lines • 6.9 kB
JavaScript
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