こんにちは、NoCodeCampのツバサです。この記事では、Airtableを使用して異なるテーブル間でデータを同期する具体的な方法を紹介します。
今回の実装イメージ
以下のようなテーブル構成があった時に、
報告書・・・日報などの報告書を作る 機械、設置場所を人が入力する
工程・・・機械と設置場所 に対しての作業工程のマニュアル作法の番号が書いてある。
「報告書」テーブルのデータを基にして、「工程」テーブルにある対応するデータを自動的に更新するプロセスを設定する方法になります。
在庫管理と発注プロセスなどにも応用できます。
例えば、今回の機能を応用すれば、製品の「在庫」テーブルと「発注」テーブルを連携させ、発注により、在庫が一定量以下になった場合に自動的に発注リストに製品を追加することで、在庫切れのアラートを出したりすることなどもできます。今回は、機械と設置場所によって、工程を探すという動作にしぼってます。
完成イメージ
上記のような構成になっており、機械と設置場所の組み合わせで工程が決まります。
工程には、機械と設置場所によって、工程の番号が定義するパターンが格納してあります。
事前準備
今回は、AirtableのScriptを使いますので、PlanがteamPlan以上が必須になります。(2024/3/25時点)
無料でも14日間はteamPlanになるので、そこでまず試してみるのもありです。
ステップ 1: テーブルの準備
まず、「報告書」と「工程」の2つのテーブルを作成します。それぞれのテーブルには、「Key1」フィールドを設定し、一意の識別子として機能させます。「工程」テーブルには、「工程名」フィールドも追加します。
また、ここで、使うKey1というのは、条件を合致させるカスタムフィールドになります。
今回は、機械と設備になりますので、Formulaで結合した文章を作ります。*設備にaが付いているのは、日本語だと検索がしずらいので、便宜上たまにつけています。ここは自由に設定してかまいません。
工程側にも同じくKey1を作成します。ここのやり方は↑と同じです。
ステップ 2: スクリプトの作成
AirtableのScriptingブロックは、Airtableベース内でカスタムスクリプトを作成し実行するための強力なツールです。この機能を利用することで、ユーザーは特定の条件に基づいてテーブル間でデータを操作したり、複雑なデータ処理を自動化したりすることができます。
スクリプトはJavaScriptで記述され、Airtable APIを通じてテーブル内のレコードにアクセスし、それらを読み書きすることができます。
AirtableのScriptは、Extentionsから追加していきます。
今回は、Scriptに以下のコードをそのまま張り付けてください
Runを押せば動くと思います。
// 定義部分
let reportsTable = base.getTable("報告書");
let processTable = base.getTable("工程");
// "報告書"テーブルからレコードを取得
let reportRecords = await reportsTable.selectRecordsAsync({fields: ["Key1"]});
// "工程"テーブルからレコードを取得
let processRecords = await processTable.selectRecordsAsync({fields: ["Key1", "工程名"]});
// "報告書"テーブルの最後に追加されたレコードを取得
let lastAddedReportRecord = reportRecords.records[reportRecords.records.length - 1];
let reportKey1 = lastAddedReportRecord.getCellValue("Key1");
// 処理対象のレコードIDを出力
output.text(`Processing report record ID: ${lastAddedReportRecord.id}`);
// Key1がnullでない場合のみ処理を続行
if (reportKey1) {
// "工程"テーブルから一致するKey1を探す
let matchingProcessRecord = processRecords.records.find(processRecord => processRecord.getCellValue("Key1") === reportKey1);
// 一致するレコードがあれば、"報告書"の工程を更新
if (matchingProcessRecord) {
let processName = matchingProcessRecord.getCellValue("工程名");
// "報告書"の工程に"工程名"を更新
await reportsTable.updateRecordAsync(lastAddedReportRecord.id, {
"工程": processName
});
output.text('Report record updated with process name.');
} else {
output.text('No matching process record found.');
}
} else {
output.text('Last added report record does not have a valid Key1.');
}
Runで最終的に実行したレコードIDが表示されます。最後に追加されたレコードに対して、工程が張り付けられました
Scriptの操作は以上です。
現在は、ScritpをRunしたときにしか動きませんが、以下のようにすると、取得したレコードのうち、最新の20件について処理を行うこともできます。
// 定義部分
let reportsTable = base.getTable("報告書");
let processTable = base.getTable("工程");
// それぞれのテーブルからレコードを取得
let reportRecords = await reportsTable.selectRecordsAsync({fields: ["Key1"]});
let processRecords = await processTable.selectRecordsAsync({fields: ["Key1", "工程名"]});
// "報告書"テーブルの最新の20件のレコードを取得
let recentReportRecords = reportRecords.records.slice(-20); // 最後から20件を取得
// 各レコードに対して処理を実行
for (let reportRecord of recentReportRecords) {
let reportKey1 = reportRecord.getCellValue("Key1");
// Key1を基に"工程"テーブルで一致するレコードを検索し、合致した場合はデータを更新
if (reportKey1) {
let matchingProcessRecord = processRecords.records.find(record => record.getCellValue("Key1") === reportKey1);
if (matchingProcessRecord) {
await reportsTable.updateRecordAsync(reportRecord.id, {
"工程": matchingProcessRecord.getCellValue("工程名")
});
}
}
}
その他でも、Automationを利用して、Airtalbleのレコード作成をトリガーに、Scriptを回すということも可能です。
まとめ
今回紹介したデータ同期の手法は、、AirtableのScriptingを駆使することで、多くの繰り返し作業を自動化し、より重要な業務に集中できるようになります。例えば、Lookupなどは、報告書を登録するUser自身が入れないとlookupできないので、フォーム側にフィルターをかけても、エンドユーザーが報告書を登録する場合には、ユーザー側にワンクリック負担がかかります。今回のScriptを利用すれば、条件をいくつも増やすことができるので、今回のように機械×設置場所 の2パターンだけでなく、3パターンや条件分岐なども追加することができ、とても汎用性に優れた方法になります。少し難易度は難しいですが、ぜひ覚えてみて下さいね。