WordPress × Googleスプレッドシートで記事管理を自動化する方法
なぜスプレッドシート × WordPress 連携が便利なのか
- 一元管理:記事のタイトルや本文、カテゴリやタグをスプレッドシートで一覧管理できるため、進捗の可視化や共有が容易になります。
- 複数人でも運用しやすい:ライター・編集者・担当者が同じスプレッドシートを共有すれば、WordPress の管理画面にログインする必要がありません。
- 自動化による効率化:Google Apps Script(GAS)を使えば、スプレッドシートへの入力をもとに WordPress への投稿(下書き/公開/予約投稿)が自動で行えます。
例えば、新記事のタイトル、本文、カテゴリなどをスプレッドシートに入力しておくだけで、所定の日時に公開されます。手作業による投稿の手間やミスを減らし、チームの作業効率を大幅に向上できます。
全体の仕組みと処理の流れ
- スプレッドシートに記事情報を入力
「記事タイトル」「本文」「カテゴリ」「タグ」「公開日」「投稿ステータス」などを入力します。管理列には投稿IDやステータス(未投稿/投稿済み)を持たせます。 - GASが WordPress REST API を呼び出す
GAS から WordPress の REST API エンドポイントに対して HTTP リクエストを送り、下書きまたは公開済みの投稿を作成します。
アクセスには基本認証(ユーザー名+アプリケーションパスワード)を用います。 - 投稿結果をスプレッドシートへ反映
投稿が成功した行には「投稿済み」や投稿IDを記録し、再投稿を防ぎます。
この流れをトリガーで自動実行すれば、指定した時間に定期的な投稿や大量の記事の一括投稿も可能です。
スプレッドシートの具体的な構成例
列 | 内容 | 説明・入力例 |
---|---|---|
A列 | 記事タイトル | 「AIで議事録を自動要約する方法」 |
B列 | 記事本文 | 投稿したい本文を記述 |
C列 | 投稿ステータス | draft(下書き)または publish(公開) |
D列 | カテゴリ(任意) | 「AI活用」などカンマ区切りで複数可 |
E列 | タグ(任意) | 「議事録, 要約」などカンマ区切りで複数可 |
F列 | 公開日(任意) | 例:2025/09/01 (未来日を指定すると予約投稿になります) |
G列 | 投稿ID/処理結果 | 投稿済みのIDや「投稿済み」など自動更新用 |
必要に応じて、画像URLやカスタムフィールド用の列を追加することも可能です。
WordPress 側での準備
アプリケーションパスワードの発行
WordPress 5.6以降は標準機能として「アプリケーションパスワード」が用意されています。以下の手順で発行します。
- WordPress 管理画面にログインし、左メニューから「ユーザー > プロフィール」を開きます。
- 「アプリケーションパスワード」セクションで新しいパスワード名(例:「GAS」)を入力し、「新しいアプリケーションパスワードを追加」をクリックします。
- 表示されたアプリケーションパスワード(ランダムな文字列)をコピーして控えておきます。
このパスワードは API 経由でアクセスする際のキーとなるため、第三者に漏らさないよう注意してください。通常のログイン用パスワードとは異なり、用途ごとに複数発行できます。
REST APIを有効化する
一部のレンタルサーバーではセキュリティ設定により REST API が無効化されている場合があります。また、海外IPからのアクセスを制限しているケースもあります。GASは Google のサーバーから実行されるため、国外アクセス制限が有効だと API へ接続できません。
- サーバーの管理パネルで REST APIの国外アクセス制限 をオフにします。例えば Xserver やスターサーバーでは「WordPressセキュリティ設定」ページに項目があります。
htaccess
でBasic認証を設定している場合や、Application Passwords が動作しない場合は.htaccess
に以下の1行を追記して、認証情報を正しく受け渡すようにします。RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
この設定により、GASからの認証付きリクエストが受け付けられるようになります。
カテゴリ・タグのID確認
WordPress REST APIではカテゴリやタグはID指定が必要です。新しいカテゴリやタグを作成しながら投稿することもできますが、事前に登録済みのIDをスプレッドシートに用意すると処理が楽になります。
- 管理画面の「投稿 > カテゴリ」や「投稿 > タグ」で各項目をクリックするとブラウザのアドレスバーに
tag_ID
やcategory_ID
が表示されます。 - GAS でカテゴリ名・タグ名から ID を取得したい場合は、WordPress REST API の
wp-json/wp/v2/categories?search=カテゴリ名
エンドポイントで検索し、存在しなければwp-json/wp/v2/categories
に POST することで自動生成できます。
GAS(Google Apps Script)の設定
スクリプトファイルの作成
- スプレッドシートのメニューから「拡張機能 > Apps Script」を開き、新しいプロジェクトを作成します。
- プロジェクトにわかりやすい名前(例:「WordPress 投稿自動化」)を付けます。
- デフォルトの
myFunction()
を削除し、以下のようなコードを記述します。
基本的な自動投稿スクリプト(シンプル版)
// WordPress REST API URL(ご自身のサイトURLに置き換え)
const WP_URL = "https://your-site.com/wp-json/wp/v2/posts";
// 認証情報:ユーザー名とアプリケーションパスワード
const WP_USER = "your-username";
const WP_PASS = "your-application-password";
// WordPressへ記事を投稿する関数
function postToWordPress(row) {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("記事一覧");
const values = sheet.getRange(row, 1, 1, 7).getValues()[0];
const [title, content, status, categories, tags, publishDate, currentStatus] = values;
// 既に投稿済みなら処理をスキップ
if (currentStatus === "投稿済み") return;
// 認証ヘッダー(Basic認証)
const token = Utilities.base64Encode(`${WP_USER}:${WP_PASS}`);
// 投稿用のデータを作成
const payload = {
title: title,
content: content,
status: status || 'draft',
date: publishDate ? new Date(publishDate).toISOString() : undefined
};
// APIリクエストオプション
const options = {
method: "post",
headers: {
"Authorization": `Basic ${token}`,
"Content-Type": "application/json"
},
payload: JSON.stringify(payload),
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(WP_URL, options);
const resData = JSON.parse(response.getContentText());
// 投稿が成功したらステータス更新
if (response.getResponseCode() === 201) {
sheet.getRange(row, 7).setValue("投稿済み");
sheet.getRange(row, 8).setValue(resData.id); // 投稿IDを保存する列
} else {
// エラー時はレスポンス内容をシートに記録するなどの処理も可能
Logger.log(response.getContentText());
}
}
上記は最小構成の例です。列数やカラム位置はご自身のシートに合わせて変更してください。status
を draft
にすると下書き投稿となり、publishDate
を未来日にすると予約投稿になります。
カテゴリ・タグを自動処理する拡張版
カテゴリ名やタグ名からIDを取得・生成して投稿に付与したい場合は以下のように関数を追加します。
// カテゴリまたはタグのIDを取得/なければ新規作成
function getOrCreateTermId(domain, username, appPassword, termName, type) {
if (!termName) return null;
const headers = {
"Authorization": "Basic " + Utilities.base64Encode(`${username}:${appPassword}`)
};
// 既存の用語を検索
const searchEndpoint = `${domain}/wp-json/wp/v2/${type}?search=${encodeURIComponent(termName)}`;
const searchResponse = UrlFetchApp.fetch(searchEndpoint, {method:'get', headers});
const existing = JSON.parse(searchResponse.getContentText());
if (existing.length > 0) {
return existing[0].id;
}
// 新規作成
const createEndpoint = `${domain}/wp-json/wp/v2/${type}`;
const payload = { name: termName };
const createResponse = UrlFetchApp.fetch(createEndpoint, {
method:'post',
headers: { ...headers, 'Content-Type': 'application/json' },
payload: JSON.stringify(payload)
});
const created = JSON.parse(createResponse.getContentText());
return created.id || null;
}
投稿処理内では、categories
や tags
列にカンマ区切りで複数指定されたカテゴリ名・タグ名を配列に変換し、それぞれ getOrCreateTermId
で取得したIDを配列にまとめて投稿データに挿入します。
画像アップロードとアイキャッチ設定
WordPressではREST APIを使ってメディアのアップロードも可能です。画像URLがスプレッドシートにある場合、まずその画像をダウンロードし、wp-json/wp/v2/media
に POST することでメディアIDを取得できます。
// 画像をWordPressにアップロードし、メディアIDを返す
function uploadImage(domain, username, appPassword, imageUrl) {
const headers = {
'Content-Disposition': 'attachment; filename=' + encodeURIComponent(imageUrl.split('/').pop()),
'Authorization': 'Basic ' + Utilities.base64Encode(`${username}:${appPassword}`)
};
const imageData = UrlFetchApp.fetch(imageUrl).getBlob();
const options = {
method: 'post',
headers: headers,
payload: imageData,
muteHttpExceptions: true
};
const response = UrlFetchApp.fetch(`${domain}/wp-json/wp/v2/media`, options);
const resData = JSON.parse(response.getContentText());
return resData.id;
}
投稿時に featured_media
プロパティにこのIDを設定するとアイキャッチ画像として指定できます。画像は外部URLからのアップロードに対応するため、スプレッドシートには直接画像ファイルを貼り付けるのではなく、公開されている画像URLを記載します。
定期実行や予約投稿の設定
- 時間主導型トリガー:GAS のトリガー機能を使うと、毎日や毎週決まった時刻にスクリプトを自動実行できます。Apps Script エディタの左側メニューから「トリガー」を開き、「時間主導型」で実行間隔を設定します。
- スプレッドシート内で日付を判定して投稿する:例えば先ほど紹介したサンプルのように、行ごとに年・月・日・曜日・時間・分などを指定し、
new Date()
と比較して条件が一致した場合のみ投稿処理を行う方法があります。週次や毎月特定曜日の投稿など柔軟なスケジュール管理ができます。 - WordPressの予約投稿機能を利用:
date
プロパティに未来の日付を ISO 形式で指定すれば WordPress 側で自動的に予約投稿になります。スプレッドシートの「公開日」列をもとにnew Date(publishDate).toISOString()
で値を生成してください。
エラー処理とログ出力
APIの呼び出しではネットワークエラーや認証エラーが発生することがあります。muteHttpExceptions: true
を指定しておくと、エラー時でもスクリプトが停止せずレスポンスが取得できるため、response.getResponseCode()
を確認しながら処理を制御できます。エラー内容をスプレッドシートやログに保存しておくと後で原因を特定しやすくなります。
セキュリティ上の注意
- アプリケーションパスワードやユーザー名は スクリプトプロパティやシークレットマネージャ に保存し、コード内にハードコーディングしないようにしましょう。Apps Script の「プロジェクトの設定」から追加可能です。
- WordPress のユーザー権限は最小限に設定してください。自動投稿専用のアカウント(投稿者権限など)を作成し、不要な管理権限を付与しないことで被害を減らせます。
- 公開範囲やカスタム投稿タイプに合わせて API エンドポイントを正しく設定します。
応用アイデア
- カテゴリやタグの自動生成:スプレッドシートに入力したカテゴリ・タグが存在しない場合は API で自動生成し、IDを返すようにすると運用が楽になります。
- 画像URLから本文への自動埋め込み:本文に
<img>
タグやショートコードを含めることで、画像URLを指定するだけで記事内に画像を配置できます。 - カスタム投稿タイプ対応:WordPress で特定のカスタム投稿タイプ(例:商品、イベント)を使っている場合、
wp-json/wp/v2/{post_type_slug}
にエンドポイントを変えれば対応できます。カスタムフィールドやメタ情報の送信もmeta
プロパティに含められます。 - 投稿の更新:既存の記事を更新したい場合は、
wp-json/wp/v2/posts/{id}
に対してPUT
を送ります。スプレッドシートに保存している投稿IDを利用して更新処理を書けます。 - 通知連携:投稿完了後に Slack やメールで通知する処理を追加すれば、チームメンバーに公開タイミングを知らせることができます。
- AI との連携:ChatGPT などの生成AIを使って本文を自動生成し、そのままスプレッドシートから投稿することも可能です。ただし公開前のチェックは必ず行ってください。
まとめ
Google スプレッドシートと WordPress REST API を Google Apps Script で繋ぐだけで、記事管理から投稿までを効率的に自動化できます。以下のポイントを押さえておけば、チームでの運用もスムーズに行えます。
- スプレッドシートを「記事管理システム」として利用し、タイトル・本文・カテゴリ・タグ・公開日などを一元管理する。
- WordPress でアプリケーションパスワードを発行し、REST API の海外アクセス制限や
.htaccess
設定を適切に行う。 - GAS で投稿スクリプトを作成し、カテゴリ・タグの ID 取得、画像アップロード、予約投稿などの機能を組み込む。
- トリガーや条件分岐を活用して定期的な投稿や特定日時に絞った投稿を自動化する。
- セキュリティとエラーハンドリングを意識し、資格情報の管理やログ出力を適切に実装する。
これらの仕組みを整えることで、記事管理の属人化を防ぎ、効率的かつ安全にブログ運営を行うことができます。複数人で協力するメディアやブログでは特に効果が大きく、運営の負担を大幅に軽減できるでしょう。