Airtable APIのライブラリを作って公開してみた(Python / GAS)

Airtableをローコードで操作できるライブラリを公開しました。
PythonおよびGoogle Apps Scriptの2種類を公開中です。

Python
https://github.com/shikumiya/airtable_client

Google Apps Script(GAS)
https://github.com/shikumiya/gas_airtable_client

※GASでのライブラリの使い方は以下の記事をご参考ください
[ワンストップでわかる！ Google Apps Scriptライブラリの使い方と作り方](https://note.com/visionarybase/n/n3ec50d398ad1)


# Airtableとは

Airtableはクラウドデータベースサービスです。
https://airtable.com/product

GoogleスプレッドシートやExcelと同様の操作感で簡単に扱えます。
各種フィルターやソート、グルーピングの機能も充実しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/f42a460a-8864-16fa-dea1-0ca281b5c65b.png" width="500">

リレーショナルなデータベースも構築でき、更に複数のビューを備えています。
カレンダービュー、カンバンビュー、ギャラリービューなど、テーブルを違う形で可視化することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/70c60a98-116a-ed62-ee08-27a471c7c0f7.png" width="500">

また、Automationの機能も保有しており、より便利なデータフローの構築も行えます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/f111aab9-d1e3-078d-618f-f247a3230ebf.png" width="500">

最近ではローコードでカスタムアクションを実装できる仕組みも加わりました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/eb79762d-9e2b-a882-fddd-69eaff8dccfa.png" width="500">

WebAPIも公開しているため、外部サービスとの連携も可能です。

# Airtableライブラリ

今回、AirtableのAPIをPythonやGASから叩くのに便利なライブラリを作成しました。
ライブラリの詳しい使い方についてはGitHubのREADMEをご参照いただきたいのですが、面倒な実装をすることなく簡単にAirtableを操作できるようになっています。

Airtable APIは100レコード毎にデータを取得しますが、全レコードを取得したい場合、普通に実装すると以下のようなコードになります。

```JavaScript:全レコードを取得(通常).gs
  // リクエスト情報の定義
  const API_KEY = 'Your API-KEY'
  const headers = {
    'Authorization': 'Bearer ' + API_KEY
  }
  const params = {
    'headers': headers
  }
  const url = 'https://api.airtable.com/v0/{BASE_ID}/{TABLE_NAME}'
  
  let recordsList = []
  
  let response, json, records, offset
  // ページオフセットがあるだけループ
  do {
    if (offset) {
      // offset付与
      response = UrlFetchApp.fetch(url + '?offset=' + offset, params)
    } else {
      response = UrlFetchApp.fetch(url, params)
    }
    // レスポンス取得
    json = JSON.parse(response.getContentText())
    
    records = json.records // レコードを取得
    recordsList.push(records)
    
    offset = json.offset // ページオフセットを取得
    if (!offset) {
      break
    }
    
    Utilities.sleep(1.0 / 5) //APIのレート制限
  } while (offset)
  
  console.log(recordsList.length)
```

これが本ライブラリを使うと以下のようなスッキリとしたコードになります。


```JavaScript:全レコードを取得(ライブラリ).gs

  const AIRTABLE_BASE_ID = 'Your BASE_ID'
  const AIRTABLE_API_KEY = 'Your API-KEY'
  
  // Airtableクライアントを生成
  const atf = new AirtableClientFactory(AIRTABLE_BASE_ID, AIRTABLE_API_KEY)
  const at = atf.create('TABLE_NAME')
  
  // 全レコードを取得
  const recordsList = at.getAll().get()
  
  console.log(recordsList.length)
```

## ライブラリを使うメリット

一般的な話にもなりますが、ライブラリを使うメリットです。

### 同じコードを何度も書かなくて良い

前述のコードでわかると思いますが、コード内の複数箇所でAirtableの操作をしたい場合、結構ボリューミーなコードが散乱します。
毎回コピペで書くのも大変ですよね。

ライブラリ化されていることによって、同じような長いコードを何度も書かなくとも良くなります。

### APIの仕様変更を意識する必要がない

GASだとUrlFetchApp.fecth()、Pythonだとrequest()など、言語で用意されているAPIを使用して実装しますよね。
また、Airtable API側に変更があった場合、該当する全ての箇所を修正し、テストしなければなりません。

ライブラリ化しておけば、ライブラリの方を修正するだけで良く、ライブラリを利用する側は特にコードを変更する必要がなくなります。

### 可読性や保守性が向上

コードが短く簡潔になるため、可読性や保守性が向上します。
しばらく時間を置いて修正が必要になった場合、長いコードに苦戦することはしばしばあります。
それは、長い、読みづらい、修正箇所が多い、もはや何を書いているのかわからない、といった原因から起こります。
それを最低限に防ぐことができます。

## ライブラリを使うデメリット

メリットだけでなく、もちろんデメリットもあります。

### ライブラリがメンテナンスされなくなる可能性

上記のようにAPIの仕様変更に対応しなければならない場合、ライブラリの作成元が修正して対応する必要があります。
作成元のベンダーやコミュニティ、個人が修正を行わない場合、ライブラリの置き換えやライブラリを使わないコードに戻す必要が出てきます。
また、不具合があった場合も同様に、作成元が修正を行わない場合は不具合が残ったままとなります。
APIに機能追加や変更があった場合も同様です。

その辺を十分に加味してライブラリの導入を検討する必要があります。

# おわりに

GAS界隈は特にライブラリ文化が醸成されていないのか、ライブラリの数が圧倒的に少ないです。
そこで今回、PythonだけでなくGASにも移植して作成することとしました。

便利なサービスをより便利に使いやすくを目指して作成しました。
皆様の一助になれば幸いです。

尚、不具合等のお問い合わせはGitHubのissueとして上げていただければ幸いです。
（一応、MITライセンスとさせていただいてます）


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581277/94fd031b-0c09-4f37-116f-c05271fdd7f9.png" width="200">
弊社は業務効率化・自動化など、仕組みで解決するお手伝いをさせていただいております。
お仕事のご依頼はコチラ↓までお願いいたします。

[株式会社シクミヤ](https://shikumiya.co.jp/)
note: [Visionary Base編集部](https://note.com/visionarybase)
Twitter: @shikumiya_hata