ガイド

AirtableをSNSに接続する方法

Airtableはほとんどのチームがソーシャルコンテンツを計画する場所です。しかし公開作業では、キャプションをスケジューラにひとつずつコピーする必要があります。このガイドでは、スクリプトとUpload-Post APIだけを使って、AirtableベースからTikTok、Instagram、YouTube、その他7つのプラットフォームに直接公開する方法を紹介します。

なぜAirtableをSNSに接続するのか

Airtableは間違いなく最高のコンテンツカレンダーツールです。ビュー、フィルター、リンクレコード、カラーコーディング、そしてちょうど良い量の構造があります。ほとんどのマーケティングチームはすでにそこでコンテンツを計画しています。問題はラストマイルです。Airtableで投稿が承認された後も、誰かがスケジューラを開き、キャプションを貼り付け、動画をアップロードし、プラットフォームを選択して公開する必要があります。すべての投稿に対して。

Upload-PostのソーシャルメディアAPIがそのギャップを埋めます。動画URL、キャプション、プラットフォームのリストを受け取り、1回のリクエストですべてに公開します。Airtableの組み込みScripting拡張機能やAutomationsと組み合わせれば、ベースで「承認済み」から「10プラットフォームで公開中」まで、ブラウザを離れることなく実現できます。

Airtableベースを設定する

「Content Calendar」というテーブルから始めましょう(ワークフローに合った名前であれば何でも構いません)。推奨する列構成:

フィールドタイプ 目的
ビデオURLURL動画ファイルへの公開リンク(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を使えば、レコードが特定の条件に一致したときにスクリプトをトリガーできます。設定方法:

  1. Airtableベースの「Automations」に移動
  2. 新しいautomationを作成
  3. トリガー: 「When record matches conditions」でStatus = 「Approved」
  4. アクション: 「Run script」
  5. スクリプト内で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を呼び出すことができます。

まさにこれを行うすぐに使えるテンプレートを用意しています:

すべてのワークフローはn8nテンプレートライブラリでご覧ください。ビジュアルビルダーを好む場合、Make.comZapierの連携も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レコード以上)の場合は、n8nPythonアプローチを使用して、Airtableのタイムアウト制約の外でレコードを処理することを検討してください。

Airtableの代わりにGoogle Sheetsを使えますか?

もちろんです。スプレッドシートを好む場合は、Google Sheets公開ガイドをご覧ください。n8nまたはMake.comをブリッジとして同じUpload-Post APIを使用します。コンセプトは同一で、データソースが変わるだけです。

写真やカルーセルはどうですか?

画像投稿(単一写真またはカルーセル)の場合は、/api/uploadの代わりに/api/upload_photosエンドポイントを使用してください。Airtableに画像URL用の別の列を追加してください。スクリプトのロジックは同じで、エンドポイントを変更してvideo_urlの代わりにphotos[]を使用するだけです。

Airtableベースを公開エンジンに変えましょう

Airtableで計画。どこにでも公開。無料のUpload-Postアカウントを作成して、数分でコンテンツカレンダーに接続しましょう。

クレジットカード不要。無料アップロード10回付き。