121 lines
3.7 KiB
JavaScript
121 lines
3.7 KiB
JavaScript
import { createClient } from '@larksuiteoapi/node-sdk';
|
|
|
|
const client = createClient({
|
|
baseURL: 'https://open.feishu.cn',
|
|
accessToken: process.env.FEISHU_USER_ACCESS_TOKEN,
|
|
});
|
|
|
|
async function createBitable() {
|
|
try {
|
|
// Step 1: Create the app
|
|
console.log('Creating app...');
|
|
const appRes = await client.bitable.app.create({
|
|
data: { name: '库存清单' }
|
|
});
|
|
|
|
if (appRes.code !== 0) {
|
|
throw new Error(`Failed to create app: ${JSON.stringify(appRes)}`);
|
|
}
|
|
|
|
const appToken = appRes.data.app.app_token;
|
|
console.log('App created:', appToken);
|
|
|
|
// Step 2: Get the default table
|
|
console.log('Getting tables...');
|
|
const tablesRes = await client.bitable.appTable.list({
|
|
path: { app_token: appToken }
|
|
});
|
|
|
|
if (tablesRes.code !== 0) {
|
|
throw new Error(`Failed to list tables: ${JSON.stringify(tablesRes)}`);
|
|
}
|
|
|
|
const tableId = tablesRes.data.items[0].table_id;
|
|
console.log('Table ID:', tableId);
|
|
|
|
// Step 3: Create fields (日期,规格,数量)
|
|
console.log('Creating fields...');
|
|
|
|
// Date field
|
|
const dateFieldRes = await client.bitable.appTableField.create({
|
|
path: { app_token: appToken, table_id: tableId },
|
|
data: {
|
|
field_name: '日期',
|
|
type: 5, // DateTime
|
|
}
|
|
});
|
|
|
|
// Spec field (Single line text)
|
|
const specFieldRes = await client.bitable.appTableField.create({
|
|
path: { app_token: appToken, table_id: tableId },
|
|
data: {
|
|
field_name: '规格',
|
|
type: 1, // Text
|
|
}
|
|
});
|
|
|
|
// Quantity field (Number)
|
|
const qtyFieldRes = await client.bitable.appTableField.create({
|
|
path: { app_token: appToken, table_id: tableId },
|
|
data: {
|
|
field_name: '数量',
|
|
type: 2, // Number
|
|
}
|
|
});
|
|
|
|
console.log('Fields created');
|
|
|
|
// Step 4: Delete default empty rows first
|
|
console.log('Cleaning empty rows...');
|
|
const recordsRes = await client.bitable.appTableRecord.list({
|
|
path: { app_token: appToken, table_id: tableId }
|
|
});
|
|
|
|
if (recordsRes.code === 0 && recordsRes.data.items.length > 0) {
|
|
const recordIds = recordsRes.data.items.map(r => r.record_id);
|
|
await client.bitable.appTableRecord.batchDelete({
|
|
path: { app_token: appToken, table_id: tableId },
|
|
data: { record_ids: recordIds }
|
|
});
|
|
console.log('Deleted', recordIds.length, 'empty rows');
|
|
}
|
|
|
|
// Step 5: Add 5 rows of sample data
|
|
console.log('Adding sample data...');
|
|
const now = Date.now();
|
|
const sampleData = [
|
|
{ '日期': now, '规格': '规格 A-001', '数量': 100 },
|
|
{ '日期': now - 86400000, '规格': '规格 B-002', '数量': 250 },
|
|
{ '日期': now - 172800000, '规格': '规格 C-003', '数量': 75 },
|
|
{ '日期': now - 259200000, '规格': '规格 D-004', '数量': 500 },
|
|
{ '日期': now - 345600000, '规格': '规格 E-005', '数量': 150 },
|
|
];
|
|
|
|
const batchRes = await client.bitable.appTableRecord.batchCreate({
|
|
path: { app_token: appToken, table_id: tableId },
|
|
data: {
|
|
records: sampleData.map(fields => ({ fields }))
|
|
}
|
|
});
|
|
|
|
if (batchRes.code !== 0) {
|
|
throw new Error(`Failed to create records: ${JSON.stringify(batchRes)}`);
|
|
}
|
|
|
|
console.log('Created', batchRes.data.items.length, 'records');
|
|
|
|
// Step 6: Return the link
|
|
const link = `https://feishu.cn/bitables/${appToken}`;
|
|
console.log('\n✅ 库存清单创建完成!');
|
|
console.log('表格链接:', link);
|
|
|
|
return { success: true, appToken, link };
|
|
|
|
} catch (error) {
|
|
console.error('Error:', error.message);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
createBitable();
|