[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;
      }
    }
  );