なぜAirtableをSNSに接続するのか
Airtableは間違いなく最高のコンテンツカレンダーツールです。ビュー、フィルター、リンクレコード、カラーコーディング、そしてちょうど良い量の構造があります。ほとんどのマーケティングチームはすでにそこでコンテンツを計画しています。問題はラストマイルです。Airtableで投稿が承認された後も、誰かがスケジューラを開き、キャプションを貼り付け、動画をアップロードし、プラットフォームを選択して公開する必要があります。すべての投稿に対して。
Upload-PostのソーシャルメディアAPIがそのギャップを埋めます。動画URL、キャプション、プラットフォームのリストを受け取り、1回のリクエストですべてに公開します。Airtableの組み込みScripting拡張機能やAutomationsと組み合わせれば、ベースで「承認済み」から「10プラットフォームで公開中」まで、ブラウザを離れることなく実現できます。
Airtableベースを設定する
「Content Calendar」というテーブルから始めましょう(ワークフローに合った名前であれば何でも構いません)。推奨する列構成:
| 列 | フィールドタイプ | 目的 |
|---|---|---|
| ビデオURL | URL | 動画ファイルへの公開リンク(Google Drive、Dropbox、S3など) |
| キャプション | ロングテキスト | 全プラットフォーム用の投稿キャプション/タイトル |
| プラットフォーム | 複数選択 | tiktok, instagram, youtube, linkedin, facebook, x, threads, pinterest |
| スケジュールされた日付 | 日付(時間付き) | 投稿の公開予定日時(空欄で即時公開) |
| ステータス | 単一選択 | ドラフト / 準備完了 / 承認済み / 公開済み / 失敗 |
| ジョブID | 単一行テキスト | アップロード後にAPIから返される(追跡用) |
Statusフィールドが主要なドライバーです。チームが投稿の準備ができたらステータスを「Approved」に変更すると、自動化がそこから引き継ぎます。ソーシャルメディア記念日カレンダーを使って重要な日付に合わせてコンテンツを計画しましょう。
Airtableから公開するためにScripting拡張機能を使用する
AirtableにはベースO内でJavaScriptを直接実行できるScripting拡張機能が同梱されています。外部ツールは不要です。ベースを開き、Extensionsをクリックし、「Scripting」を追加して、以下のコードを貼り付けてください:
// Airtable Scripting Extension
let table = base.getTable('コンテンツカレンダー');
let query = await table.selectRecordsAsync();
let record = query.records.find(r => r.getCellValue('ステータス')?.name === 'Ready');
if (!record) {
output.text('No records with Status = Ready');
} else {
let formData = new FormData();
formData.append('video_url', record.getCellValue('ビデオURL'));
formData.append('title', record.getCellValue('キャプション'));
formData.append('user', 'mybrand');
formData.append('platform[]', 'tiktok');
formData.append('platform[]', 'instagram');
let response = await fetch('https://api.upload-post.com/api/upload', {
method: 'POST',
headers: { '認可': 'APIキー your-api-key-here' },
body: formData
});
let result = await response.json();
await table.updateRecordAsync(record, {
'ステータス': { name: '公開済み' },
'ジョブID': result.job_id
});
output.text('Published! Job ID: ' + result.job_id);
} このスクリプトはステータスが「Ready」の最初のレコードを見つけ、動画URLとキャプションをソーシャルメディア投稿APIに送信し、返されたジョブIDでレコードを更新します。いつでも手動で実行するか、次のセクションの自動化に組み込むことができます。
マルチプラットフォーム公開では、ハードコーディングの代わりにPlatformsフィールドを動的に読み取りましょう。利用可能なすべてのプラットフォーム値については、複数プラットフォームへの同時投稿ガイドをご覧ください。
Airtable Automationsでトリガーする
手動スクリプトは便利ですが、本当のAirtable SNS自動化はハンズフリーの公開を意味します。Airtable Automationsを使えば、レコードが特定の条件に一致したときにスクリプトをトリガーできます。設定方法:
- Airtableベースの「Automations」に移動
- 新しいautomationを作成
- トリガー: 「When record matches conditions」でStatus = 「Approved」
- アクション: 「Run script」
- スクリプト内で
input.config()を使用してトリガーからレコードIDを受け取る
// Airtable Automation Script
let inputConfig = input.config();
let table = base.getTable('コンテンツカレンダー');
let record = await table.selectRecordAsync(inputConfig.recordId);
let platforms = record.getCellValue('プラットフォーム');
let formData = new FormData();
formData.append('video_url', record.getCellValue('ビデオURL'));
formData.append('title', record.getCellValue('キャプション'));
formData.append('user', 'mybrand');
for (let p of platforms) {
formData.append('platform[]', p.name.toLowerCase());
}
let response = await fetch('https://api.upload-post.com/api/upload', {
method: 'POST',
headers: { '認可': 'APIキー your-api-key-here' },
body: formData
});
let result = await response.json();
await table.updateRecordAsync(record.id, {
'ステータス': { name: '公開済み' },
'ジョブID': result.job_id
}); これで、誰かがレコードのステータスを「Approved」に変更するたびに、自動化が起動し、Upload-Post APIを呼び出してレコードを更新します。これにより、コンテンツ承認ワークフローが実現します。チームがAirtableで下書きし、マネージャーが承認すると、投稿が自動的に公開されます。手動ステップなし、スケジューラなし、コピペ不要です。
Airtableから投稿をスケジュールする
即時公開ではなく特定の日時に公開したい場合は、Scheduled Dateフィールドを読み取り、scheduled_dateとしてAPIに渡します。これがAirtableを完全なSNSスケジューリングツールに変える方法です。
// Add scheduling support
let scheduledDate = record.getCellValue('スケジュールされた日付');
if (scheduledDate) {
formData.append('scheduled_date', new Date(scheduledDate).toISOString());
formData.append('timezone', 'アメリカ/ニューヨーク');
}
// Or use the queue for automatic optimal timing
formData.append('add_to_queue', 'true'); add_to_queue=trueパラメータはUpload-Postに次の空きタイムスロットを選ばせるため、投稿が一度にすべて公開されるのではなく均等に配分されます。スケジューリングオプションの詳細はスケジューリングガイドをご覧ください。TikTok投稿のスケジュールやInstagram投稿の自動化の専用ガイドもご確認いただけます。
複雑なワークフローにn8nをブリッジとして使用する
Airtableと公開の間にさらにロジックが必要なチーム(Slack経由の承認、AI生成キャプション、ウォーターマーク除去など)には、n8nが最適なツールです。n8nはAirtableベースの新規または更新されたレコードを監視し、任意の数のステップで処理してから、Upload-Post APIを呼び出すことができます。
まさにこれを行うすぐに使えるテンプレートを用意しています:
- Google DriveからInstagram、TikTok、YouTubeへ(AI説明文+Airtableトラッキング付き)
- Google SheetsからInstagram、LinkedIn、TikTokへスケジュール自動投稿
すべてのワークフローはn8nテンプレートライブラリでご覧ください。ビジュアルビルダーを好む場合、Make.comやZapierの連携もAirtableをトリガーとして使用できます。
コンテンツカレンダー全体を一括公開する
一度に1レコードずつ公開する代わりに、ステータスが「Ready」のすべてのレコードをループして、1回のスクリプト実行ですべてを公開できます。週次の一括アップロードやバックログのクリアに便利です。
// Batch publish all Ready records
let table = base.getTable('コンテンツカレンダー');
let query = await table.selectRecordsAsync();
let readyRecords = query.records.filter(
r => r.getCellValue('ステータス')?.name === 'Ready'
);
output.text('Found ' + readyRecords.length + ' records to publish');
for (let record of readyRecords) {
let platforms = record.getCellValue('プラットフォーム');
let formData = new FormData();
formData.append('video_url', record.getCellValue('ビデオURL'));
formData.append('title', record.getCellValue('キャプション'));
formData.append('user', 'mybrand');
for (let p of platforms) {
formData.append('platform[]', p.name.toLowerCase());
}
let scheduledDate = record.getCellValue('スケジュールされた日付');
if (scheduledDate) {
formData.append('scheduled_date', new Date(scheduledDate).toISOString());
}
try {
let response = await fetch('https://api.upload-post.com/api/upload', {
method: 'POST',
headers: { '認可': 'APIキー your-api-key-here' },
body: formData
});
let result = await response.json();
await table.updateRecordAsync(record, {
'ステータス': { name: '公開済み' },
'ジョブID': result.job_id
});
output.text('Published: ' + record.getCellValue('キャプション'));
} catch (err) {
await table.updateRecordAsync(record, {
'ステータス': { name: '失敗しました' }
});
output.text('Failed: ' + record.getCellValue('キャプション'));
}
} 大量のボリュームについては、動画の一括アップロードガイドをご覧ください。バッチ操作にPythonを好む場合は、Python自動化ガイドでAirtableのREST APIから読み取るスクリプトの構築を解説しています。
アップロードステータスをAirtableで追跡する
アップロードを送信した後、動画の処理と各プラットフォームへの配信には数秒かかる場合があります。ステータスエンドポイントをポーリングして、結果をAirtableレコードに書き戻すことができます:
// Check upload status and update Airtable
let table = base.getTable('コンテンツカレンダー');
let query = await table.selectRecordsAsync();
let pendingRecords = query.records.filter(
r => r.getCellValue('ステータス')?.name === '公開済み'
&& r.getCellValue('ジョブID')
);
for (let record of pendingRecords) {
let jobId = record.getCellValue('ジョブID');
let response = await fetch(
'https://api.upload-post.com/api/uploadposts/status?job_id=' + jobId,
{ headers: { '認可': 'APIキー your-api-key-here' } }
);
let status = await response.json();
if (status.status === 'completed') {
await table.updateRecordAsync(record, {
'ステータス': { name: 'Live' }
});
} else if (status.status === 'failed') {
await table.updateRecordAsync(record, {
'ステータス': { name: '失敗しました' }
});
}
} これを別のScripting拡張機能ボタンとして実行するか、タイマー付きの自動化(例: 10分ごと)を設定して、Airtableベースを実際の投稿ステータスと同期させましょう。各プラットフォームのダッシュボードを個別に確認することなく、完全な監査証跡が得られます。
プラットフォーム別のヒント
Airtableのコンテンツカレンダーをソーシャルメディアに接続する際、各プラットフォームには独自の特徴があります:
- TikTok: キャプションにハッシュタグを含めてください。APIがTikTokのアップロードフロー(開示設定を含む)を自動的に処理します。
- Instagram: Reels(動画)とフォトカルーセルに対応。画像投稿には
/api/upload_photosを使用してください。 - YouTube: メインキャプションとは別の長い説明文に
youtube_descriptionを追加してください。 - LinkedIn: プロフェッショナルなトーンが重要です。Airtableに「LinkedIn Caption」の別列を検討してください。
Hootsuiteのような従来のツールと比較してみてください。完全なコントロール、プラットフォームごとの制限ゼロ、そしてすべてがチームがすでに作業しているAirtable内に残ります。
よくある質問
Airtableの無料プランで使えますか?
はい。Scripting拡張機能とAutomationsは両方ともAirtableの無料プランで利用できます。無料プランでは月100回のAutomation実行に制限されますが、小規模チームには十分です。有料Airtableプランでは制限が大幅に増加します。
Can I attach videos directly to Airtable instead of a URL?
Scripting拡張機能は添付ファイルフィールドを読み取れますが、クラウドホスティングされたファイル(Google Drive、Dropbox、S3)へのURL列を使用する方が簡単です。Upload-Post APIはファイルの直接アップロードとURLの両方を受け付けますが、AirtableスクリプトではURLの方が扱いやすくなっています。
1回のバッチで何レコード処理できますか?
Upload-Post側にハード制限はありません。ただし、Airtable Scripting拡張機能は無料プランで30秒のタイムアウトがあります。大規模バッチ(50レコード以上)の場合は、n8nやPythonアプローチを使用して、Airtableのタイムアウト制約の外でレコードを処理することを検討してください。
Airtableの代わりにGoogle Sheetsを使えますか?
もちろんです。スプレッドシートを好む場合は、Google Sheets公開ガイドをご覧ください。n8nまたはMake.comをブリッジとして同じUpload-Post APIを使用します。コンセプトは同一で、データソースが変わるだけです。
写真やカルーセルはどうですか?
画像投稿(単一写真またはカルーセル)の場合は、/api/uploadの代わりに/api/upload_photosエンドポイントを使用してください。Airtableに画像URL用の別の列を追加してください。スクリプトのロジックは同じで、エンドポイントを変更してvideo_urlの代わりにphotos[]を使用するだけです。