こんにちは、ZernioパートナーのHodaです。
複数のSNSを運用していると、同じ投稿をThreads、Bluesky、LinkedIn X(旧Twitter)などへ一つずつ登録する作業が意外と手間になります。

一般的にはSocialDogやBufferのようなSNS管理ツールを使う方法がありますが、今回は少し違う方法として、次の3つを組み合わせて、自分専用のSNS投稿管理システムを作ります。
- Googleスプレッドシート
- Google Apps Script(GAS)
- Zernio API(無料)
完成後は、Googleスプレッドシートへ投稿文、リンク、画像、投稿先、投稿日時を入力するだけで、Zernioを経由して複数SNSへ即時投稿または予約投稿できます。
今回作るSNS自動投稿システム
今回の仕組みは、次の流れで動作します。
- Googleスプレッドシートへ投稿内容を入力する(1行に1投稿)
- ステータスを「準備完了」に変更する
- GASが投稿内容を取得する
- Zernio APIへ投稿データを送信する
- Zernioから接続済みのSNSへ投稿する
- 送信結果やエラー内容をスプレッドシートへ書き戻す
投稿日時を入力していない場合は即時投稿、未来の日時を入力している場合は予約投稿として処理します。
Googleスプレッドシート
↓
Google Apps Script
↓
Zernio API
↓
Threads・Bluesky・LinkedInなど
僕の環境ではThreadsとBlueskyを接続してテストしましたが、コード側で投稿先を固定しているわけではありません。
Zernioに接続されているSNSアカウントをAPIから取得し、実際に接続されているSNSだけを投稿先として表示します。
たとえば、Zernioに次のアカウントを接続している場合、
- Threads
- Bluesky
- X(Twitter)
スプレッドシートの投稿先にも、この4つが自動的に表示されます。
この方法のメリット
この仕組みの大きなメリットは、普段使い慣れているGoogleスプレッドシートを投稿管理画面として使えることです。
一般的なSNS管理ツールでは、サービス側が用意した管理画面や運用方法に合わせる必要があります。
一方、GoogleスプレッドシートとZernio APIを組み合わせる方法なら、必要な列や運用フローを自由に変更できます。
たとえば、将来的には次のような機能も追加できます。
- 担当者名の管理
- 投稿前の承認フロー
- カテゴリー別の投稿管理
- AIによる投稿文の作成
- SNSごとの投稿文の変更
- 投稿済みURLの取得
- エラー投稿だけを再送信
- Googleフォームから投稿案を追加
今回の記事では、まず初心者でも扱いやすい基本的な自動投稿システムを作ります。
必要なもの
今回の仕組みを作るために必要なものは、次の3つです。
① Googleアカウント
GoogleスプレッドシートとGoogle Apps Scriptを使用します。
通常のGoogleアカウントがあれば、追加料金なしで利用できます。
② Zernioアカウント
Zernioは、複数のSNSを一つのAPIから操作できるSNS・メッセージング統合サービスです。
Zernio側で、投稿したいSNSアカウントをあらかじめ接続しておきます。

今回のデモでは、ThreadsとBlueskyを接続しています。
③ ZernioのAPIキー
Google Apps ScriptからZernioへアクセスするために、ZernioのAPIキーが必要です。

APIキーは第三者に知られないように管理してください。今回のコードでは、スプレッドシートのセルやコード内へ直接書かず、Apps Scriptの「スクリプト プロパティ」に保存します。
Zernioの登録方法、アカウント連携方法、APIの取得方法等はYoutubeのチュートリアル動画の方をご確認ください!
Googleスプレッドシートを作成する
通常であれば、Googleシートを作成し、GASのコードを貼り付けてを行う必要があるのですが、今回は僕の方でテンプレートを用意しました!
こちらのシートをコピーいただくことで、必要なシートとGASをそのまま複製することができます。
シートをコピーできましたら 拡張機能 > App Script に進みまして、スクリプトが表示されているかご確認ください。ここにコードが表示されていれば正常にコピーできています
GASのコードが心配な方は、ChatGPTなどで安全かどうか聞いていただければと思います。
ちなみに、今回コードは主に以下の機能を含んでいます
- 投稿管理シートの作成
- 設定シートの作成
- Zernio接続アカウントの取得
- 投稿先プルダウンの自動生成
- 即時投稿
- 予約投稿
- 画像URLの送信
- 投稿結果の記録
- エラー内容の記録
- 重複投稿を防ぐためのリクエストID
Zernio APIキーを取得
まずは、Zernioに無料登録をします。2アカウントまでは無料で連携することができます。
サイトにアクセスし、右上の 「Start for Free」をクリックします
Google、Github、メールアドレスで登録できるので、お好きな方法で無料登録します。登録にクレジットカードは不要です

登録が完了すると、APIキーが表示されます。 one-time display とかいてありますので、このAPIキー自体はセキュリティの観点から一度しか表示されず、ページを離れてしまうと再度見ることはできません。 後から別のAPIキーを自由に作成することもできますが、折角ですのでこのキーをコピーしておきましょう。そして、念のためにメモ帳などに一時的に貼っておくことをオススメします。

ZernioのAPIキーをGASに貼る
APIキーは、コードの中へ直接貼り付けるのではなく、Apps Scriptのスクリプトプロパティへ保存します。
Apps Scriptの左側にある歯車アイコンから、次へ進みます。
プロジェクトの設定
→ スクリプト プロパティ
→ スクリプト プロパティを追加

次の内容を登録してください。
| 項目 | 入力内容 |
|---|---|
| プロパティ | ZERNIO_API_KEY |
| 値 | Zernioで発行したAPIキー |
APIキーには、引用符や余計なスペースを付けず、そのまま入力します。

設定が終わったら「スクリプト プロパティを保存」をクリックします。
SNSアカウントと連携をする
次に、 Zernio→SNSアカウント の連携をします。再度Zernioに戻り、 Connections > New Connection をクリックします。以下のように連携できるプラットフォームが表示されるので、クリックをして連携をします。連携自体は基本的にログイン認証で簡単に接続することができます。

以下のように、プロフィールが表示されており connected になっていれば正常に接続できています。

Google シートに戻り、アカウント情報を取得する
次に、「設定」タブに進みます。設定シートは、Zernioに接続されているSNSアカウントを管理するためのシートです。
初期設定後、上部メニューから次を実行します。
SNS自動投稿
→ 接続アカウントを取得
GASがZernio APIへアクセスし、現在Zernioに接続されているSNSアカウントを取得します。

取得に成功した場合、設定シートには、次の情報が表示されます。
| 列 | 内容 |
|---|---|
| プラットフォーム | Threads、Bluesky、Instagramなど |
| アカウント名 | SNSのアカウント名 |
| Zernio Account ID | Zernio内部のアカウントID |
| 接続状態 | connectedなどの接続状態 |
| 投稿対象 | 自動投稿の対象にするか |
| 最終取得日時 | アカウント情報を取得した日時 |
「投稿対象」列にはチェックボックスが表示されます。
チェックが入っているアカウントだけが投稿対象になります。
たとえばThreadsとBlueskyの両方にチェックが入った状態で、投稿先として「すべて」を選択すると、両方へ投稿されます。
Blueskyのチェックを外した場合、「すべて」を選んでもThreadsだけが投稿対象になります。
「投稿管理」シートの使い方
実際の投稿内容は「投稿管理」シートで管理します。
投稿管理シートには、次の列があります。
| 列 | 内容 |
|---|---|
| 投稿ID | 投稿を識別するためのID |
| 投稿文 | SNSへ投稿する本文 |
| リンクURL | 本文の後ろへ追加するURL |
| 画像URL | 投稿に添付する画像URL |
| 投稿先 | 投稿するSNS |
| 投稿日 | 予約投稿する日付 |
| 投稿時刻 | 予約投稿する時刻 |
| ステータス | 下書き・準備完了・送信済み・エラー |
| Zernio投稿ID | Zernioから返された投稿ID |
| 結果 | 即時投稿または予約投稿の結果 |
| エラー内容 | 送信に失敗した理由 |
| API送信日時 | Zernioへ送信した日時 |
投稿ID(任意/自動挿入)
投稿IDは、投稿を一意に識別するための値です。
空欄の場合は、投稿処理時に自動生成されます。
重複投稿を防ぐためのリクエストIDとしても使用しています。
投稿文 (必須)
SNSへ投稿する本文を入力します。
GoogleスプレッドシートからSNSへ自動投稿するテストです。
リンクURL (任意)
記事やサービスページのURLを入力します。
リンクURLを入力すると、投稿文の後ろに空行を入れて自動追加されます。
たとえば、次のように入力した場合、
投稿文:
新しい記事を公開しました!
リンクURL:
https://example.com/article
実際の投稿内容は次の形になります。
新しい記事を公開しました!
https://example.com/article
リンクを付けない場合は、空欄で構いません。
画像URL(任意)
投稿に画像を添付する場合は、外部から直接アクセスできる画像URLを入力します。
https://example.com/images/sample.jpg
通常のGoogleドライブ共有URLなど、画像ファイルそのものではなく共有ページを表示するURLは利用できない場合があります。
最初の動作テストでは、画像URLを空欄にしたテキスト投稿から試すのがおすすめです。
const imageUrls = String(
row[3] || ''
)
// 半角カンマ・日本語カンマ・改行で分割
.split(/[\n,、]+/)
.map(function(url) {
return url.trim();
})
.filter(function(url) {
return url !== '';
});
投稿先(必須)
投稿先はプルダウンから選択します。
Zernioに接続され、設定シートで「投稿対象」にチェックが入っているSNSだけが候補として表示されます。
たとえば、Threads,Bluesky,instagramを接続している場合は次のようになります。
すべて
Bluesky
Threads
instagram
「すべて」を選択すると、設定シートで有効になっている全アカウントへ投稿します。
投稿日(任意)
予約投稿する日付を指定します。
セルをダブルクリックするとカレンダーが表示されるため、カレンダーから日付を選択できます。
2026/07/24
上記の形式であれば、タイピングで入力いただいてもOKです。
投稿時刻(任意)
予約投稿する時刻を入力します。
14:00
21:40
09:15
00:00から23:59までの時刻を、24時間形式で入力します。
即時投稿と予約投稿の違い
投稿日と投稿時刻を両方空欄にすると、即時投稿として処理します。
投稿日:空欄
投稿時刻:空欄
予約投稿の場合は、投稿日と投稿時刻の両方を入力します。
投稿日:2026/07/24
投稿時刻:21:40
片方だけ入力した場合は、誤投稿を防ぐためエラーになります。
また、指定した日時が過去、または現在時刻に近すぎる場合も、即時投稿へ勝手に切り替えずエラーで停止します。
ステータスの違い
ステータスは、次の4種類です。
| ステータス | 意味 |
|---|---|
| 下書き | まだ自動送信しない |
| 準備完了 | 次回のGAS実行時にZernioへ送る |
| 送信済み | Zernioへの送信が完了した |
| エラー | 送信に失敗した |
普段皆さんが操作するのは、主に「下書き」と「準備完了」です。
投稿内容を作成している間は「下書き」にします。
内容の確認が終わり、送信してよい状態になったら「準備完了」に変更します。
GASからZernioへの送信に成功すると、自動的に「送信済み」へ変わります。
即時投稿だったのか、予約投稿だったのかは、「結果」列に表示されます。
即時投稿を受け付けました
または、
予約投稿を登録しました
選択した1行を手動で送信する
最初のテストでは、自動処理を設定する前に、1行だけ手動で送信するのがおすすめです。
投稿したい行のセルを一つ選択し、次を実行します。
SNS自動投稿
→ 選択した行を送信
手動送信では、ステータスが「下書き」の状態でも送信できます。
最初は次のような内容でテストすると分かりやすいです。
| 項目 | 入力内容 |
|---|---|
| 投稿文 | Googleスプレッドシートからの自動投稿テストです。 |
| リンクURL | 空欄 |
| 画像URL | 空欄 |
| 投稿先 | Blueskyなど1つのSNS |
| 投稿日 | 未来の日付 |
| 投稿時刻 | 現在より十分先の時刻 |
| ステータス | 下書き |
送信に成功すると、Zernio投稿ID、結果、API送信日時がシートへ記録されます。
Zernio側のコンテンツカレンダーにも、予約投稿が追加されていることを確認できます。
複数の投稿をまとめて送信する
複数行をまとめてZernioへ送る場合は、対象行のステータスを「準備完了」にします。
その後、次を実行します。
SNS自動投稿
→ 準備完了を一括送信
ステータスが「準備完了」になっている行だけが処理されます。
「下書き」「送信済み」「エラー」の行は処理されません。
エラーが発生した場合
送信に失敗すると、ステータスが「エラー」になり、「エラー内容」列に原因が表示されます。
よくある原因としては、次のようなものがあります。
APIキーが設定されていない
スクリプトプロパティに次の内容が登録されているか確認します。
プロパティ:ZERNIO_API_KEY
値:Zernioで発行したAPIキー
ただし、これは接続アカウントが取得できてれば、その時点でAPIが有効なはずなので、滅多に発生することはありません。
投稿対象のSNSが見つからない
設定シートを確認し、投稿したいSNSの「投稿対象」にチェックが入っているか確認します。
必要に応じて、次を再実行してください。
SNS自動投稿
→ 接続アカウントを取得
予約日時が過去になっている
指定した投稿日と投稿時刻が、現在より十分先になっているか確認してください。
現在より過去の日時や、現在時刻から1分以内の日時はエラーになります。
投稿日または投稿時刻の片方だけが入力されている
予約投稿では、投稿日と投稿時刻の両方が必要です。
即時投稿にする場合は、両方を空欄にしてください。
Blueskyの文字数を超えている
Blueskyを投稿先に含める場合は、リンクURLも含めて300文字以内にします。
Threadsだけへ投稿する場合は、500文字以内です。その他のSNSごとに文字数のルールなどがあるので、エラーの内容を確認しましょう
画像URLを取得できない
画像URLは、外部から画像ファイルへ直接アクセスできる必要があります。GoogleDriveなどの画像リンクは対応していません。
ブラウザのシークレットウィンドウなどでURLを開き、ログインなしで画像だけが表示されるか確認してください。
すべてのSNSで同じ投稿ができるわけではない
今回のコードは、Zernioに接続されているSNSアカウントを自動取得し、投稿先として選択できるようにしています。
ただし、SNSごとに投稿の必須条件は異なります。
たとえば、次のような違いがあります。
- Instagramは投稿形式によって画像や動画が必要
- YouTubeは動画やタイトルなどが必要
- TikTokは動画や公開範囲の設定が必要
- Pinterestではボード指定が必要になる場合がある
- 一部のSNSではプラットフォーム固有設定が必要
そのため、今回のサンプルコードは、共通して扱いやすい次の項目を中心にしています。
- 投稿文
- リンクURL
- 画像URL1枚
- 投稿先
- 投稿日
- 投稿時刻
SNS固有の設定が必要な場合は、コードを拡張して対応する必要があります。ClaudやChatGPTに相談することで簡単にカスタマイズできます。
今回の仕組みをさらに発展させるなら
今回作成したシステムは、基本的な自動投稿機能までですが、Googleスプレッドシートを使っているため、自由に拡張できます。
承認フローを追加する
ステータスに「確認待ち」や「承認済み」を追加すれば、担当者が作成し、管理者が確認してから投稿する運用を作れます。
下書き
↓
確認待ち
↓
承認済み
↓
Zernioへ送信
SNSごとに文章を変更する
次のような列を追加します。
共通投稿文
Threads用投稿文
Bluesky用投稿文
LinkedIn用投稿文
SNSごとの文字数や雰囲気に合わせて、投稿文を変更できます。
AIに投稿文を作らせる
記事URLや記事タイトルを入力し、ChatGPTなどのAI APIを使って投稿文を自動生成することも可能です。
記事URLを入力
↓
AIがSNS投稿文を作成
↓
人が内容を確認
↓
準備完了
↓
Zernioへ予約投稿
投稿履歴を別シートへ保存する
送信済みの投稿を「投稿履歴」シートへ移動すれば、投稿管理シートを常に見やすい状態に保てます。
X(旧Twitter)へ投稿する場合の注意点
ZernioにXアカウントを接続すれば、今回作成したGoogleスプレッドシートからXへの投稿・予約投稿も可能です。
ただし、XはほかのSNSと比べて、文字数制限とAPI利用料金に特に注意が必要なプラットフォームです。
通常アカウントは280文字まで
Xの通常アカウントでは、1投稿あたりの上限は280文字です。X Premiumを利用しているアカウントでは最大25,000文字まで投稿できますが、無料アカウントへ投稿する場合は280文字以内に収める必要があります。
また、XではURLの実際の長さにかかわらず、1つのURLが23文字としてカウントされます。絵文字は種類によって2文字として数えられるため、Googleスプレッドシート上で見た文字数よりも、X側の判定が大きくなる場合があります。
たとえば、LinkedInでは最大3,000文字、Facebookでは非常に長い文章を投稿できますが、その文章をそのままXへ同時投稿すると、Xだけ文字数超過で失敗する可能性があります。
今回のサンプルコードでは、基本的にすべてのSNSへ共通の投稿文を送信します。そのため、投稿先にXを含める場合は、本文とリンクを含めて280文字以内に収めるのが安全です。
Zernioでは、プラットフォームごとに異なる文章を指定するcustomContentも利用できます。将来的にコードを拡張すれば、LinkedInには詳しい文章、Xには短い文章を送るといった使い分けも可能です。
同じ内容の連続投稿は拒否される
Xでは、同一または非常によく似た内容の投稿が重複投稿として拒否されることがあります。
過去の投稿を再利用する場合は、そのまま再送信するのではなく、文章、冒頭の表現、ハッシュタグなどを変更してください。また、短時間に連続投稿すると制限にかかる場合があるため、Zernioでは投稿間隔を空けることも推奨されています。
XだけはAPIの利用回数に応じて別料金が発生する
ZernioでXを利用する場合、通常のZernio利用料金とは別に、X APIの従量課金が発生します。

Zernioが独自に上乗せしている料金ではなく、Xが定めたAPI料金を、そのまま同額で請求するパススルー方式です。Zernioによる上乗せはありません。
2026年7月時点で、代表的なX APIの料金は次のとおりです。
| 操作 | 料金 |
|---|---|
| 通常のテキスト投稿 | 1回あたり$0.015 |
| URLを含む投稿 | 1回あたり$0.200 |
| 投稿・分析データの取得 | 1件あたり$0.005 |
| DMの取得 | 1件あたり$0.010 |
| DMの送信 | 1回あたり$0.015 |
特に注意したいのが、URLを含む投稿は1回あたり$0.200かかる点です。通常のテキスト投稿は$0.015なので、URL付き投稿は約13倍の料金になります。
たとえば、URLを含む投稿を月に100件行うと、投稿処理だけで次の金額になります。
$0.200 × 100件 = $20
これに分析データの取得、投稿結果の確認、DM処理、フォロワー情報の取得などを利用すると、その回数に応じて追加料金が発生します。
利用上限を設定して予期しない請求を防ぐ
Zernioのダッシュボードでは、X APIに使う月間上限額を設定できます。
設定した金額の80%に達すると警告メールが届き、100%に達すると、その期間中はXの分析取得や受信トレイの定期確認が自動的に停止します。予期しない請求を防ぐため、Xアカウントを接続したら、最初に上限額を設定しておくと安心です。
料金は今後変更される可能性があるため、実際に運用を始める前に、ZernioとXの最新料金表も確認してください。X APIは、操作ごとにクレジットを消費する従量課金方式です。
Xを投稿先に含める場合のチェック項目
投稿前に、少なくとも次の点を確認しておきましょう。
- 通常アカウントでは、URLを含めて280文字以内になっているか
- 過去に投稿した内容と同一または類似しすぎていないか
- URL付き投稿のAPI料金を把握しているか
- Zernio側でXの月間利用上限を設定しているか
- 複数SNSへの同時投稿では、Xだけ短い文章を用意する必要がないか
XはZernioから投稿できる便利なプラットフォームですが、ほかのSNSとは料金体系が異なります。特に今回のような自動投稿システムへ組み込む場合は、文字数だけでなく、投稿回数やURLの有無も意識して運用してください。
まとめ
今回は、Googleスプレッドシート、Google Apps Script、Zernio APIを組み合わせて、複数SNSへ自動投稿・予約投稿する仕組みを作りました。
基本的な流れは次のとおりです。
- Googleスプレッドシートへ投稿内容を入力
- 投稿日と投稿時刻を指定
- ステータスを「準備完了」に変更
- GASがZernio APIへ送信
- Zernioが指定したSNSへ投稿
- 結果をスプレッドシートへ記録
一般的なSNS管理ツールは、登録後すぐ使える点が便利です。
一方、GoogleスプレッドシートとZernio APIを使う方法には、自分の業務や運用フローに合わせて自由に変更できるメリットがあります。
まずは今回の基本コードを使って、テキストだけの予約投稿から試してみてください。
動作を確認できたら、画像投稿、承認フロー、AIによる文章生成などへ発展させると、自分専用のSNS運用システムとしてさらに便利になります。


