Files
autogame-17_feishu-doc/lib/bitable.js

75 lines
2.4 KiB
JavaScript

async function fetchBitableContent(token, accessToken) {
// 1. List tables
const tablesUrl = `https://open.feishu.cn/open-apis/bitable/v1/apps/${token}/tables`;
const tablesRes = await fetch(tablesUrl, {
headers: { 'Authorization': `Bearer ${accessToken}` }
});
const tablesData = await tablesRes.json();
if (tablesData.code !== 0) {
return { title: "Bitable", content: `Error fetching bitable tables: ${tablesData.msg}` };
}
const tables = tablesData.data.items;
if (!tables || tables.length === 0) {
return { title: "Bitable", content: "Empty Bitable." };
}
let fullContent = [];
// 2. Fetch records
// Prioritize Ignacia's table (tblJgZHOmPybgX60) if present
const targetTableId = "tblJgZHOmPybgX60";
const targetTable = tables.find(t => t.table_id === targetTableId);
// If target found, only fetch it. Otherwise fetch first 3 to be safe/fast.
const tablesToFetch = targetTable ? [targetTable] : tables.slice(0, 3);
for (const table of tablesToFetch) {
const tableId = table.table_id;
const tableName = table.name;
// List records
const recordsUrl = `https://open.feishu.cn/open-apis/bitable/v1/apps/${token}/tables/${tableId}/records?page_size=20`;
const recRes = await fetch(recordsUrl, {
headers: { 'Authorization': `Bearer ${accessToken}` }
});
const recData = await recRes.json();
fullContent.push(`## Table: ${tableName}`);
if (recData.code === 0 && recData.data && recData.data.items) {
const records = recData.data.items;
// Convert records (objects with fields) to table
// We need to know all possible fields to make a header
const allFields = new Set();
records.forEach(r => Object.keys(r.fields).forEach(k => allFields.add(k)));
const headers = Array.from(allFields);
let md = "| " + headers.join(" | ") + " |\n";
md += "| " + headers.map(() => "---").join(" | ") + " |\n";
for (const rec of records) {
md += "| " + headers.map(h => {
const val = rec.fields[h];
if (typeof val === 'object') return JSON.stringify(val);
return val || "";
}).join(" | ") + " |\n";
}
fullContent.push(md);
} else {
fullContent.push(`(Could not fetch records: ${recData.msg})`);
}
}
return {
title: "Feishu Bitable",
content: fullContent.join("\n\n")
};
}
module.exports = {
fetchBitableContent
};