[Node.js] Airtable APIを使用する 2 (レコード登録・更新・削除)
2023-02-01
2023-02-01
この記事は[Node.js] Airtable APIを使用する 1 (基本設定・データ取得)の続きです。
テスト用のテーブルについては、前回の記事を参照してください。
検証環境
- Windows 10 Pro 22H2
- Node.js v18.14.0
- airtable.js 0.11.6
レコードを登録
AirtableBase.create
メソッドの引数に配列を渡すことで、レコードの新規作成が可能です。
ただし、一度に登録できるレコードの最大数は10なので、10件以上登録したい場合は、配列を分割して create
メソッドを繰り返す必要があります。
ソースコード
const dotenv = require('dotenv');
const Airtable = require('airtable');
dotenv.config();
// 配列を指定した数で分割
const sliceByNumber = (array, number) => {
const length = Math.ceil(array.length / number);
return new Array(length)
.fill()
.map((_, i) => array.slice(i * number, (i + 1) * number));
};
// 指定したミリ秒待機
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
// ダミーのレコードを25件作成
const newRecords = [];
const numDummyRecords = 25;
for (let i = 0; i < numDummyRecords; i++) {
const obj = {
fields: {
Name: `Dummy Record ${i}`,
Notes: `dummy note ${i}`,
Image: [],
Status: 'Pending',
},
};
newRecords.push(obj);
}
// 作成したいレコードの配列を、要素数10件の配列に分割
const slicedNewRecords = sliceByNumber(newRecords, 10);
// AirtableのAPI認証とBaseの取得
const base = new Airtable({ apiKey: process.env.AIRTABLE_API_KEY }).base(
process.env.AIRTABLE_BASE_ID
);
// レコード作成
const tableName = 'TestTable';
const delay_ms = 500;
(async () => {
for (const r of slicedNewRecords) {
base(tableName).create(r, function (err, records) {
if (err) {
console.error(err);
return;
}
});
await sleep(delay_ms);
}
})();
また、Attachiment Fieldsにファイルを追加したい場合、Airtable APIを使って直接ファイルのアップロードはできません。
別途サーバーにファイルをアップロードし、Airtableにはアクセス制限のかかっていない、パブリックなURLを渡す必要があります。
...
fields: {
Name: `Dummy Record ${i}`,
Notes: `dummy note ${i}`,
Image: [{url: 'https://...'}],
Status: 'Pending',
}
...
レコードを更新
Record.updateFields()
メソッドで、指定したFieldの値を変更することが可能です。
以下のソースコードでは、指定したテーブルに含まれるすべてのレコードのStatusをPendingにしています。
ソースコード
import dotenv from 'dotenv';
import Airtable from 'airtable';
dotenv.config();
// AirtableのAPI認証とBaseの取得
const base = new Airtable({ apiKey: process.env.AIRTABLE_API_KEY }).base(
process.env.AIRTABLE_BASE_ID
);
const tableName = 'TestTable';
base(tableName)
.select()
.eachPage(
function page(records, fetchNextPage) {
records.forEach(function (record) {
// レコード更新
record.updateFields({ Status: 'Pending' });
});
fetchNextPage();
},
function done(err) {
if (err) {
console.error(err);
return;
}
}
);
レコードを削除
Record.destroy()
メソッドでレコードを削除することが可能です。
以下のソースコードでは、StatusがRejectedのレコードをすべて削除しています。
ソースコード
import dotenv from 'dotenv';
import Airtable from 'airtable';
dotenv.config();
// AirtableのAPI認証とBaseの取得
const base = new Airtable({ apiKey: process.env.AIRTABLE_API_KEY }).base(
process.env.AIRTABLE_BASE_ID
);
const tableName = 'TestTable';
base(tableName)
.select({
// StatusがRejectedのレコードを取得
filterByFormula: '{Status} = "Rejected"',
})
.eachPage(
function page(records, fetchNextPage) {
records.forEach(function (record) {
// レコード削除
record.destroy();
});
fetchNextPage();
},
function done(err) {
if (err) {
console.error(err);
return;
}
}
);