「毎日決まった時間にTikTokへ動画を投稿したい」
「複数のTikTokアカウントへの投稿作業をもっと効率化したい」
もしあなたがマーケティング担当者やコンテンツクリエイターとして、こうした悩みを抱えているなら、この記事はきっと役に立つでしょう。手作業での投稿作業は、時間も労力もかかり、他の重要な業務を圧迫しがちです。特に、複数のアカウントを運用している場合や、毎日欠かさず投稿したい場合には、その負担は計り知れません。
そこで本記事では、Googleの無料ツールであるGoogle Apps Script (GAS) と TikTok Content Posting API を連携させ、Googleドライブに保存した動画ファイルを全自動でTikTokに投稿するシステムを構築する方法を、手順を追って徹底的に解説します。一度このシステムを構築すれば、あなたのTikTok運用は劇的に効率化されるはずです。
この自動投稿システムを導入することで、主に以下のことが実現可能になります。
- Googleドライブの特定フォルダに動画をアップロードするだけで、自動的にTikTokへ投稿されます。
- GASの強力なトリガー機能を利用し、「毎日午前8時」のように詳細な投稿時間をスケジュール設定できます。
- 応用次第で、複数のTikTokアカウントの投稿作業を一元的に管理することも夢ではありません。
これにより、あなたは動画コンテンツの企画・制作といったクリエイティブな作業に集中できるようになり、投稿作業にかかっていた時間を大幅に削減できるでしょう。
システム全体の流れを理解する
この自動投稿システムがどのように機能するのか、まずはその全体像を把握しましょう。仕組みは非常にシンプルです。
- ユーザーのアクション: あなたは投稿したい動画ファイルを、あらかじめ指定したGoogleドライブの特定のフォルダにアップロードします。
- GASの起動: 設定した時間になると、Google Apps Script (GAS) が自動的に起動します。これはGASの「時間主導型トリガー」という機能を使います。
- GASの処理: 起動したGASスクリプトは以下の処理を順番に行います。
- 指定されたGoogleドライブフォルダから、投稿対象となる動画ファイルを取得します。
- TikTok Content Posting APIに接続します。この際、事前に取得した認証情報(Client Key, Client Secret)と、ユーザーの認証(OAuth2.0)を利用します。
- APIを通じて、取得した動画ファイルをTikTokサーバーへアップロードします。
- アップロードが完了した動画に対して、APIを使って投稿処理を完了させ、公開状態にします。
- TikTokへの投稿: TikTok側でAPIからの指示を受け取り、あなたのTikTokアカウントに動画が投稿されます。
このシステムは、Googleドライブを「投稿予約ボックス」のように利用するイメージです。ドライブに動画を入れるだけで、あとはGASが指定時間に自動で処理してくれる、というわけです。
STEP 1: 【最重要】事前準備と前提条件
この自動投稿システムを構築する上で、最も重要かつ、もしかすると最大のハードルとなるのが、TikTok側の事前準備です。Content Posting APIを利用するためには、いくつかの必須条件を満たし、TikTokによる審査を通過する必要があります。
このステップをクリアしなければ、APIを利用した自動投稿は実現できません。しっかりと手順を確認しましょう。
1. TikTokビジネスアカウントの取得
Content Posting APIは、個人のTikTokアカウントでは利用できません。必ず「ビジネスアカウント」である必要があります。まだビジネスアカウントをお持ちでない場合は、お使いのスマートフォンアプリから簡単に切り替えられます。
TikTokアプリでのビジネスアカウントへの切り替え手順は以下の通りです。
- TikTokアプリを開き、画面右下の「プロフィール」アイコンをタップしてプロフィール画面を開きます。
- プロフィール画面の右上にある三本線メニュー (☰) をタップします。
- 表示されたメニューの中から「設定とプライバシー」を選択します。
- 「アカウント」をタップし、次に「ビジネスアカウントに切り替える」を選択します。
- 画面の指示に従い、あなたのビジネスに最も適した業種カテゴリなどを選択して完了です。
ビジネスアカウントに切り替えると、アプリ内で動画を作成・編集する際に使用できる音源が「商用楽曲ライブラリ」に含まれるものに限定されます。これは、ビジネス利用における著作権の問題をクリアするためです。ただし、今回のようにAPIを使って外部から動画ファイルを直接アップロードする場合、動画ファイルに含まれるオリジナルの音声がそのまま使用されるため、アプリ内の音源ライブラリの制限は直接的な影響は少ないと考えられます。
2. TikTok for Developers でのAPI利用申請と承認
ビジネスアカウントに切り替えたら、次にTikTokのAPIを利用するための申請を行います。これがこのシステムの構築における最大の関門と言えるでしょう。Content Posting APIは誰でもすぐに利用できるわけではなく、TikTokによる厳しい審査と承認が必要です。
まず、ウェブブラウザで「TikTok for Developers」にアクセスします。
https://developers.tiktok.com/
アクセスしたら、APIを利用したいTikTokアカウントでログインしてください。
ログイン後、以下の手順で新しいアプリを作成し、Content Posting APIの利用申請を行います。
- ダッシュボード画面で「Manage apps」を選択し、表示されたページで「Create new app」ボタンをクリックします。
- 新しいアプリの作成画面が表示されます。「アプリの種類」で Server-side app を選択してください。
- アプリ名(例: TikTok自動投稿システム)やアプリの説明などを入力します。これらの情報は審査の際にTikTok側が確認しますので、具体的に、このアプリで何を実現したいのか(例: Googleドライブからの動画自動投稿による運用効率化)を記述することが重要です。
- アプリを作成したら、そのアプリの「App details」ページに移動します。
- 「App details」ページ内に「Products」という項目があります。ここで「Add products」ボタンをクリックします。
- 利用可能なAPIプロダクトの一覧が表示されるので、「Content Posting API」を探し、「Add」をクリックして利用申請を行います。
- 申請画面が表示されます。ここでは、あなたのアプリがContent Posting APIをどのように利用するのか、その目的や具体的なユースケースを詳細に記述する必要があります。この記述内容が審査の合否に大きく影響します。 例えば、「自社で制作した動画コンテンツを、Googleドライブにアップロードすることで、毎日定時にTikTokへ自動投稿し、マーケティング活動を効率化するため」のように、具体的かつ誠実に記述しましょう。
- 必要な情報を全て入力したら、申請を提出します。
申請提出後、TikTokによる審査が行われます。この審査には時間がかかる場合があります。審査基準は公開されていませんが、アプリの説明や利用目的が明確であること、TikTokの利用規約やAPIポリシーに準拠していることなどが重要と考えられます。審査に無事通過しなければ、この先のステップには進むことができません。 焦らず、結果を待ちましょう。
審査に無事通過すると、作成したアプリの「App details」ページで、以下の非常に重要な情報が取得できるようになります。
- Client Key
- Client Secret
これらは、あなたのGASスクリプトがTikTok APIに接続する際に必要となる、いわば「鍵」のようなものです。これらの情報は後ほどGASのコード内で使用しますので、安全な場所に控えておいてください。
STEP 2: Google Apps Script (GAS) のプロジェクト準備
TikTok側の準備が整い、Client KeyとClient Secretを取得できたら、いよいよGoogle Apps Script (GAS) でのシステム構築に取り掛かります。
まずはGASのプロジェクトを作成します。
-
ウェブブラウザでGoogle Apps Scriptにアクセスします。
https://script.google.com/
2. アクセスしたら、左上の「新しいプロジェクト」ボタンをクリックして、新しいGASプロジェクトを作成します。
3. 作成されたプロジェクトに、後から見て分かりやすい名前をつけましょう。例えば「TikTok自動投稿システム」などが良いでしょう。
TikTok APIとの連携には、OAuth2.0という認証プロトコルを使用します。このOAuth2.0の処理はやや複雑ですが、幸いなことにGASにはOAuth2認証を簡単に実装できる便利なライブラリが存在します。このライブラリをプロジェクトに追加しましょう。
GASエディタの左側メニューを見てください。下の方に「ライブラリ」という項目があります。
- 「ライブラリ」の右側にある「+」ボタンをクリックします。
- 「ライブラリを追加」というダイアログが表示されます。
-
「スクリプト ID」の欄に、以下のOAuth2ライブラリのIDを入力し、「検索」ボタンをクリックします。
1B7FSrk57A1B_rTR362_bJSPbSr2aR6-OseVd822zdokNIZ__sJ_gX0_p
4. 検索結果に「OAuth2」というライブラリが表示されるはずです。バージョンを選択するドロップダウンメニューがありますので、最新版を選択してください。
5. 「識別子」はデフォルトの「OAuth2」のままで構いません。
6. 右下の「追加」ボタンをクリックします。
これで、あなたのGASプロジェクトでOAuth2ライブラリが利用可能になりました。
STEP 3: GASでTikTok APIへの接続と動画投稿コードを記述
いよいよ、自動投稿処理の中核となるGASコードを記述します。GASエディタに以下のコードを貼り付けてください。
// 【★★要設定★★】 自身の環境に合わせて以下の値を設定してください
const CLIENT_KEY = 'YOUR_CLIENT_KEY'; // TikTok for Developersで取得したClient Key
const CLIENT_SECRET = 'YOUR_CLIENT_SECRET'; // TikTok for Developersで取得したClient Secret
const DRIVE_FOLDER_ID = 'YOUR_GOOGLE_DRIVE_FOLDER_ID'; // 動画を格納するGoogleドライブのフォルダID
// --- OAuth2認証サービスを作成 ---
function getTiktokService() {
// OAuth2ライブラリを使ってTikTok用の認証サービスを構築
return OAuth2.createService('TikTok')
// TikTokの認証エンドポイントURLを設定
.setAuthorizationBaseUrl('https://www.tiktok.com/v2/auth/authorize/')
// TikTokのトークン取得エンドポイントURLを設定
.setTokenUrl('https://open.tiktokapis.com/v2/oauth/token/')
// TikTok for Developersで取得したクライアントIDを設定
.setClientId(CLIENT_KEY)
// TikTok for Developersで取得したクライアントシークレットを設定
.setClientSecret(CLIENT_SECRET)
// 認証後のリダイレクト先としてGAS内のコールバック関数を指定
.setCallbackFunction('authCallback')
// 認証情報をGASのユーザープロパティに保存するためのストアを設定
.setPropertyStore(PropertiesService.getUserProperties())
// 必要なAPIスコープ(権限)を指定 - 動画投稿には 'video.publish' が必須
.setScope('video.publish')
// 認証リクエストに追加するパラメータとしてclient_keyを含める
.setParam('client_key', CLIENT_KEY)
// トークンリクエストに追加するパラメータとしてgrant_typeを指定
.setAdditionalParams({ 'grant_type': 'authorization_code' });
}
// --- 認証コールバック関数 ---
// TikTokでの認証完了後にTikTokサーバーから呼び出される関数
function authCallback(request) {
const tiktokService = getTiktokService();
// 認証リクエストを処理し、アクセストークンを取得・保存
const isAuthorized = tiktokService.handleCallback(request);
if (isAuthorized) {
// 認証成功時のメッセージをHTMLで返す
return HtmlService.createHtmlOutput('認証に成功しました。このタブを閉じてください。');
} else {
// 認証失敗時のメッセージをHTMLで返す
return HtmlService.createHtmlOutput('認証に失敗しました。');
}
}
// --- 初回認証用のURLをログに出力する関数 ---
// この関数を実行して得られるURLをブラウザで開き、TikTokと連携を承認する
function logAuthorizationUrl() {
const tiktokService = getTiktokService();
if (!tiktokService.hasAccess()) {
// アクセス権がない場合、認証URLをログに出力
Logger.log('以下のURLにアクセスして認証してください:');
Logger.log(tiktokService.getAuthorizationUrl());
} else {
// 既に認証済みの場合のメッセージ
Logger.log('既にTikTokへのアクセス権があります。');
}
}
// --- メインの自動投稿関数 ---
// 指定したGoogleドライブフォルダから動画を取得し、TikTokへ投稿する処理
function postVideoToTiktok() {
const tiktokService = getTiktokService();
// TikTokへのアクセス権があるか確認
if (!tiktokService.hasAccess()) {
Logger.log('TikTokへのアクセス権がありません。logAuthorizationUrl()を実行して認証してください。');
return; // アクセス権がない場合は処理を中断
}
// 1. Googleドライブから動画ファイルを取得
try {
const folder = DriveApp.getFolderById(DRIVE_FOLDER_ID); // 設定したフォルダIDからフォルダを取得
const files = folder.getFiles(); // フォルダ内のファイル一覧を取得
// 投稿対象のファイルがあるか確認
if (!files.hasNext()) {
Logger.log('投稿する動画ファイルが見つかりません。指定フォルダに動画ファイルをアップロードしてください。');
return; // ファイルがない場合は処理を中断
}
// 最初に見つかったファイル(最も古いファイルなど、運用に合わせて変更可能)を取得
const videoFile = files.next();
const videoBlob = videoFile.getBlob(); // ファイルの内容をBlob形式で取得
Logger.log(`動画ファイル「${videoFile.getName()}」のアップロード処理を開始します。`);
// 2. TikTokへ動画をアップロード (初期化)
// 動画アップロードのための初期化処理を行い、アップロードURLなどを取得
const accessToken = tiktokService.getAccessToken(); // 保存されているアクセストークンを取得
const uploadInitOptions = {
method: 'post', // POSTメソッドでリクエスト
headers: {
'Authorization': 'Bearer ' + accessToken, // 認証情報(アクセストークン)をヘッダーに含める
'Content-Type': 'application/json' // リクエストボディの形式を指定
},
payload: JSON.stringify({ // リクエストボディ(JSON形式)
'post_info': {
'title': videoFile.getName(), // 動画ファイル名を投稿のタイトルに設定(任意)
'privacy_level': 'PUBLIC_TO_EVERYONE', // 公開範囲を設定 (PUBLIC_TO_EVERYONE, FRIEND_TO_FRIEND, SELF_ONLY)
'disable_comment': false, // コメントを有効にするか
'disable_duet': false, // デュエットを有効にするか
'disable_stitch': false // ステッチを有効にするか
},
'source_info': {
'source': 'FILE_UPLOAD', // アップロード方法を指定 (ファイルアップロード)
'video_size': videoBlob.getBytes().length, // 動画ファイルのサイズ(バイト)
'chunk_size': videoBlob.getBytes().length, // チャンクサイズ(今回はファイルを分割せず一括アップロード)
'total_chunk_count': 1 // チャンクの総数(一括アップロードなので1)
}
}),
muteHttpExceptions: true // HTTPエラーが発生しても例外を投げずにレスポンスを返す
};
// TikTok APIの初期化エンドポイントへリクエストを送信
const uploadInitResponse = UrlFetchApp.fetch('https://open.tiktokapis.com/v2/post/publish/video/init/', uploadInitOptions);
const uploadInitResult = JSON.parse(uploadInitResponse.getContentText()); // レスポンスをJSONとしてパース
// 初期化が成功したか確認
if (uploadInitResult.error.code !== 'ok') {
Logger.log('動画アップロードの初期化に失敗しました: ' + uploadInitResult.error.message);
Logger.log('レスポンス詳細: ' + JSON.stringify(uploadInitResult)); // デバッグ用にレスポンス全体もログに出力
return; // 失敗した場合は処理を中断
}
// 3. 取得したURLに動画データをアップロード
// 初期化レスポンスから取得したアップロードURLに動画データを送信
const uploadUrl = uploadInitResult.data.upload_url; // アップロードURLを取得
const uploadOptions = {
method: 'put', // PUTメソッドでリクエスト(ファイルアップロード)
contentType: videoBlob.getContentType() || 'video/mp4', // ファイルのMIMEタイプを指定 (取得できない場合はvideo/mp4)
payload: videoBlob, // アップロードする動画データ (Blob形式)
muteHttpExceptions: true // HTTPエラーが発生しても例外を投げずにレスポンスを返す
};
Logger.log(`取得したアップロードURLへ動画データの送信を開始します。`);
const uploadResponse = UrlFetchApp.fetch(uploadUrl, uploadOptions); // アップロードURLへリクエストを送信
// アップロードが成功したか確認 (HTTPステータスコード200番台)
if (uploadResponse.getResponseCode() < 200 || uploadResponse.getResponseCode() >= 300) {
Logger.log('TikTokサーバーへの動画データアップロードに失敗しました。ステータスコード: ' + uploadResponse.getResponseCode());
Logger.log('レスポンス詳細: ' + uploadResponse.getContentText()); // デバッグ用にレスポンス全体もログに出力
return; // 失敗した場合は処理を中断
}
Logger.log(`動画データのアップロードが完了しました。`);
// 4. 動画の公開ステータスを確認・完了
// 動画データのアップロードが完了したら、投稿処理を完了させる
const publishId = uploadInitResult.data.publish_id; // 初期化レスポンスから取得したpublish_id
const publishStatusOptions = {
method: 'post', // POSTメソッドでリクエスト
headers: {
'Authorization': 'Bearer ' + accessToken, // 認証情報(アクセストークン)
'Content-Type': 'application/json', // リクエストボディの形式
},
payload: JSON.stringify({ 'publish_id': publishId }), // リクエストボディ(publish_idを指定)
muteHttpExceptions: true // HTTPエラーが発生しても例外を投げずにレスポンスを返す
};
// TikTok側での処理に時間がかかる場合があるため、少し待機してからステータスを確認する
Logger.log('TikTokサーバーでの処理を待機中 (10秒)...');
Utilities.sleep(10000); // 10秒 (10000ミリ秒) 待機
Logger.log(`動画の公開ステータスを確認します。Publish ID: ${publishId}`);
const statusResponse = UrlFetchApp.fetch('https://open.tiktokapis.com/v2/post/publish/status/fetch/', publishStatusOptions); // ステータス確認エンドポイントへリクエスト送信
const statusResult = JSON.parse(statusResponse.getContentText()); // レスポンスをJSONとしてパース
// 投稿処理が成功したか確認
if (statusResult.error.code === 'ok' && statusResult.data.status === 'STATE_SUCCESS') {
Logger.log(`動画の投稿が完了しました! 公開ステータス: ${statusResult.data.status}`);
// 投稿が完了したら、重複投稿を防ぐために処理済みファイルを別のフォルダに移動するなどの処理を追加することを強く推奨します。
// 例: 投稿完了後にファイルを移動する場合
// const doneFolderId = 'YOUR_DONE_FOLDER_ID'; // 処理済みファイルを移動するフォルダのID
// const doneFolder = DriveApp.getFolderById(doneFolderId);
// videoFile.moveTo(doneFolder);
// Logger.log(`処理済み動画ファイル「${videoFile.getName()}」を別のフォルダに移動しました。`);
} else if (statusResult.error.code === 'ok' && statusResult.data.status === 'STATE_IN_PROGRESS') {
Logger.log(`動画の投稿処理は進行中です。しばらくしてからTikTokアカウントを確認してください。公開ステータス: ${statusResult.data.status}`);
}
else {
Logger.log('動画の公開に失敗しました、または処理が完了していません。エラーメッセージ: ' + statusResult.error.message);
Logger.log('レスポンス詳細: ' + JSON.stringify(statusResult)); // デバッグ用にレスポンス全体もログに出力
}
} catch (e) {
// 予期せぬエラーが発生した場合のログ出力
Logger.log('スクリプト実行中にエラーが発生しました: ' + e.toString());
Logger.log('エラーが発生したファイル: ' + e.fileName);
Logger.log('エラーが発生した行番号: ' + e.lineNumber);
}
}
このコードは、以下の主要な関数で構成されています。
* `getTiktokService()`: OAuth2ライブラリを使用して、TikTok APIへの認証に必要なサービスオブジェクトを生成します。APIのエンドポイントURL、クライアント情報、必要な権限(スコープ)、コールバック関数などを設定しています。
* `authCallback(request)`: TikTokでの認証プロセス完了後にTikTokサーバーから呼び出される関数です。認証コードを受け取り、アクセストークンを取得してGASのプロパティストアに保存します。
* `logAuthorizationUrl()`: 初回認証を行うために、ユーザーがブラウザでアクセスすべき認証URLをログに出力します。このURLを開いてTikTokとの連携を承認する必要があります。
* `postVideoToTiktok()`: 自動投稿処理のメイン関数です。Googleドライブから動画ファイルを取得し、TikTok Content Posting APIを呼び出して動画のアップロード、そして投稿の完了処理を行います。
コード内のコメントで、各行の処理内容やAPIリクエストの詳細を補足していますので、合わせてご確認ください。
コードの初期設定と初回認証
貼り付けたコードを利用するために、いくつかの初期設定とTikTokとの連携(認証)が必要です。
-
コードの編集(設定値の変更):
貼り付けたコードの冒頭部分にある以下の3つの定数を、あなたの環境に合わせて書き換えてください。javascript
const CLIENT_KEY = 'YOUR_CLIENT_KEY'; // TikTok for Developersで取得したClient Key
const CLIENT_SECRET = 'YOUR_CLIENT_SECRET'; // TikTok for Developersで取得したClient Secret
const DRIVE_FOLDER_ID = 'YOUR_GOOGLE_DRIVE_FOLDER_ID'; // 動画を格納するGoogleドライブのフォルダIDYOUR_CLIENT_KEY
: STEP 1-2でTikTok for Developersから取得したClient Keyに置き換えます。YOUR_CLIENT_SECRET
: STEP 1-2でTikTok for Developersから取得したClient Secretに置き換えます。YOUR_GOOGLE_DRIVE_FOLDER_ID
: 投稿したい動画を格納するGoogleドライブのフォルダIDに置き換えます。フォルダIDは、そのフォルダをブラウザで開いたときのURLに含まれる「folders/」の後ろの文字列です。
設定項目 | 説明 | 取得場所/設定方法 |
---|---|---|
CLIENT_KEY |
TikTok APIにアクセスするためのクライアント識別子 | TikTok for Developers で作成したアプリの詳細ページ |
CLIENT_SECRET |
CLIENT_KEY と対になる秘密鍵 |
TikTok for Developers で作成したアプリの詳細ページ |
DRIVE_FOLDER_ID |
自動投稿したい動画ファイルを置くGoogleドライブのフォルダの固有ID | 対象のGoogleドライブフォルダをブラウザで開き、URLの folders/ 以降をコピー |
-
初回認証の実行:
GASスクリプトがあなたの代わりにTikTokへ投稿するには、あなたのTikTokアカウントからの「許可」が必要です。OAuth2認証フローを通じて、この許可を行います。- GASエディタの上部にある関数選択ドロップダウンメニューから、
logAuthorizationUrl
を選択します。 - その右隣にある実行ボタン(▶️アイコン)をクリックします。
- 初回実行時には、Googleからの承認を求められます。「権限を確認」をクリックし、表示されるダイアログであなたのアカウントを選択し、「許可」をクリックしてください。
- スクリプトが実行され、画面下部の「実行ログ」(Ctrl+Enter または Cmd+Enter で表示/非表示)に、TikTokとの連携を承認するためのURLが表示されます。
以下のURLにアクセスして認証してください:
https://www.tiktok.com/v2/auth/authorize/?client_key=YOUR_CLIENT_KEY&scope=video.publish&response_type=code&redirect_uri=https%3A%2F%2Fscript.google.com%2Fmacros%2Fd%2F...%2Fusercallback&state=...
* 表示されたURLをコピーし、ウェブブラウザのアドレスバーに貼り付けて開きます。
* TikTokの認証画面が表示されます。投稿を許可したいTikTokアカウントでログインし、連携を承認するボタンをクリックします。
* 認証が成功すると、「認証に成功しました。このタブを閉じてください。」というメッセージが表示されたページにリダイレクトされます。これで、GASがあなたの代わりにTikTok APIを操作するためのアクセストークンがGASのプロパティストアに安全に保存されました。 - GASエディタの上部にある関数選択ドロップダウンメニューから、
発行された認証URLは一度しか有効ではありません。認証に失敗したり、再度認証が必要になった場合は、再度 `logAuthorizationUrl()` 関数を実行して新しいURLを発行してください。
STEP 4: 投稿のテストと自動実行の設定
コードの設定と認証が完了したら、実際に動画が自動投稿されるかテストしてみましょう。そして、問題なく動作することを確認できたら、いよいよ自動実行のトリガーを設定します。
手動でテスト実行する
本番運用を開始する前に、必ずテストを行ってください。
- テスト用動画ファイルの準備: 自動投稿システムでテストするために、GoogleドライブのSTEP 3で設定したフォルダに、テスト用の短い動画ファイル(MP4形式推奨)をアップロードしてください。ファイル名は日本語でも問題ありません。
- GASスクリプトの実行:
- GASエディタの上部にある関数選択ドロップダウンメニューから、今度は
postVideoToTiktok
を選択します。 - その右隣にある実行ボタン(▶️アイコン)をクリックします。
- スクリプトが実行され、ログに処理の進行状況が表示されます。
- 実行ログを確認し、「動画の投稿が完了しました!」といったメッセージが表示されれば成功です。
- GASエディタの上部にある関数選択ドロップダウンメニューから、今度は
実行ログには、スクリプトが正常に動作しているか、あるいはエラーが発生しているかなどの重要な情報が表示されます。何か問題が起きた場合は、必ずログを確認して原因を探りましょう。エラーメッセージが具体的な解決のヒントになります。
テスト実行が成功したら、実際にあなたのTikTokアカウントに動画が投稿されているか確認してみましょう。タイトルが動画ファイル名になっているか、公開範囲は設定通りかなども合わせて確認してください。
GASの実行時間制限について
無料版のGoogle Apps Scriptには、いくつかの実行制限があります。その一つに、1回のスクリプト実行につき最大6分間という時間制限があります。
動画ファイルのサイズが大きい場合や、インターネット接続が不安定な場合など、動画のアップロード処理がこの6分を超えてしまう可能性があります。6分を超えるとスクリプトは強制的に終了され、エラーとなります。
このため、このシステムで投稿する動画は、尺を短くする、あるいはファイルサイズを小さくするなどの工夫が必要です。もし長尺の動画を投稿したい場合は、別途、動画ファイルを分割してアップロードするなどのより高度な処理が必要になります(今回のコードでは一括アップロードを想定しています)。
自動実行トリガーの設定
手動でのテスト実行が成功し、問題なく動作することを確認できたら、いよいよこのスクリプトを毎日自動で実行するように設定します。GASのトリガー機能を使います。
- トリガー設定画面へ移動:
GASエディタの左側メニューを見てください。時計アイコンの「トリガー」という項目があります。これをクリックします。 - 新しいトリガーの追加:
トリガー設定画面の右下にある「トリガーを追加」ボタンをクリックします。 -
トリガーの設定:
表示されたダイアログで、以下のように設定を行います。- 実行する関数を選択: ドロップダウンメニューから
postVideoToTiktok
を選択します。 - 実行するデプロイを選択: 通常は「Head」を選択します。
- イベントのソースを選択: 「時間主導型」を選択します。
- 時間ベースのトリガーのタイプを選択: 「日付ベースのタイマー」を選択します。
- 時刻を選択: 自動投稿を行いたい時間帯を選択します。例えば「午前8時~9時」などを選択すると、その時間帯のどこかでスクリプトが実行されます。厳密な時刻を指定することはできません。
- エラー通知設定: 必要に応じて、スクリプト実行時にエラーが発生した場合の通知方法を設定できます。デフォルトでは「毎日通知を受け取る」などが選択されています。
- 実行する関数を選択: ドロップダウンメニューから
-
保存:
設定が完了したら、右下の「保存」ボタンをクリックします。Googleからの承認を再度求められる場合がありますので、その際は許可してください。
これで、毎日指定した時間になるとGASが自動的に postVideoToTiktok
関数を実行し、Googleドライブの指定フォルダにある動画ファイルがTikTokに自動投稿されるようになりました!
現在のコードでは、投稿が完了してもGoogleドライブのファイルはそのまま残ります。同じファイルが翌日も投稿されてしまうのを防ぐために、投稿が成功した動画ファイルは別のフォルダに移動したり、ファイル名を変更したりする処理を postVideoToTiktok
関数の末尾(投稿成功のログ出力後)に追加することを強く推奨します。コード内のコメントアウトされた部分を参考に、運用に合わせて実装してみてください。
// 投稿が完了したら、重複投稿を防ぐために処理済みファイルを別のフォルダに移動するなどの処理を追加することを強く推奨します。
// 例: 投稿完了後にファイルを移動する場合
// const doneFolderId = 'YOUR_DONE_FOLDER_ID'; // 処理済みファイルを移動するフォルダのID
// const doneFolder = DriveApp.getFolderById(doneFolderId);
// videoFile.moveTo(doneFolder);
// Logger.log(`処理済み動画ファイル「${videoFile.getName()}」を別のフォルダに移動しました。`);
上記のコメントアウトを外し、YOUR_DONE_FOLDER_ID
を実際に移動先のフォルダIDに書き換えることで、処理済みファイルを自動で移動させることができます。あらかじめGoogleドライブに「投稿済みTikTok動画」のようなフォルダを作成しておくと良いでしょう。
メリット・デメリット、そして考慮事項
このGASとTikTok Content Posting APIを連携させた自動投稿システムは非常に強力ですが、メリットだけでなく、いくつかのデメリットや考慮すべき点も存在します。導入を検討する上で、これらを理解しておくことは重要です。
- 作業効率の劇的な向上: 手動での動画アップロード、情報入力、投稿といった一連の作業が不要になります。動画ファイルを指定フォルダに入れるだけで投稿が完了するため、特に毎日投稿を行う場合や複数のアカウントを運用している場合の時間と労力を大幅に削減できます。
- 投稿忘れの防止: GASのトリガー機能により、設定した時間に自動でスクリプトが実行されるため、「投稿するのを忘れてしまった」というミスを防ぐことができます。
- スケジュール投稿の実現: 厳密な時間指定は難しいものの、特定の時間帯に投稿をスケジュール化できます。これは、ターゲット層がTikTokをよく利用する時間帯に合わせて投稿したい場合に非常に有効です。
- 一元管理の可能性: 基本形では1つのGoogleドライブフォルダから1つのTikTokアカウントへの投稿ですが、応用次第で、スプレッドシートで投稿スケジュールやアカウントを管理し、複数のアカウントへの投稿を自動化することも理論上は可能です。
- コスト: Google Apps Scriptは無料で使用できます(ただし、無料利用枠には制限があります。今回の用途であれば通常は無料枠で十分でしょう)。TikTok Content Posting APIの利用自体も無料です。
- API利用申請のハードル: Content Posting APIの利用にはTikTokによる審査と承認が必要です。この審査に通過できない場合、そもそもシステムを構築することができません。申請時には利用目的を明確に、誠実に記述することが重要です。
- 技術的な知識が必要: GASのコードを理解し、設定値を適切に変更する必要があります。プログラミングの経験がない方にとっては、学習コストがかかる可能性があります。
- GASの実行時間制限: 無料版GASの1回の実行時間は最大6分です。動画ファイルのサイズが大きいとアップロードに時間がかかり、時間切れでエラーとなる可能性があります。投稿する動画のサイズや尺には注意が必要です。
- API仕様変更のリスク: APIは提供元(この場合はTikTok)の都合により仕様が変更されたり、提供が終了したりする可能性があります。API仕様が変更された場合、スクリプトの修正が必要になる場合があります。
- 機能の制限: Content Posting APIは、TikTokアプリで手動投稿する際に利用できる全ての機能(例: 人気の音源の使用、高度な編集フィルターの適用など)を提供しているわけではありません。今回のコードでは、動画ファイルに含まれるオリジナルの音声がそのまま使用されます。また、投稿後のキャプションにハッシュタグやメンションを自動で追加するなどの機能は、APIの仕様を確認しながら実装する必要があります。
- エラー発生時の対応: スクリプトの実行中にエラーが発生した場合、ログを確認して原因を特定し、コードを修正する必要があります。エラーハンドリングを強化することで、エラー発生時の対応をスムーズにすることは可能ですが、ある程度の技術的な知識は必要です。
項目 | メリット | デメリット/考慮事項 |
---|---|---|
投稿作業 | 自動化による時間短縮・効率化、投稿忘れ防止 | 初期設定の手間、エラー対応の必要性 |
運用 | スケジュール投稿、一元管理(応用) | GASの実行時間制限(6分)、API仕様変更リスク |
機能 | Googleドライブ連携、動画ファイル名をタイトルに利用(基本形) | 音源選択不可(API仕様)、アプリの全機能は利用不可 |
コスト | 基本的に無料で利用可能 | なし |
実践的なアドバイスと今後の展望
この自動投稿システムをより効果的に運用し、さらに発展させるための実践的なアドバイスと今後の展望について触れておきましょう。
- 投稿後のファイル管理を徹底する: 前述の通り、投稿が完了した動画ファイルは必ず別のフォルダに移動するか、ファイル名を変更するなどして、翌日以降の重複投稿を防いでください。これが最も基本的なエラー防止策となります。
- ログを定期的に確認する: GASの実行ログを定期的に確認する習慣をつけましょう。エラーが発生していないか、スクリプトが正常に完了しているかを確認することで、問題の早期発見につながります。
- エラーハンドリングを強化する: 提供したコードは基本的なエラーハンドリングを含んでいますが、より堅牢なシステムにするためには、APIからの様々なエラーレスポンスに対応できるような処理を追加検討しましょう。例えば、アップロードに失敗した場合にリトライ処理を行うなどが考えられます。
- 動画形式とサイズに注意: TikTokが推奨する動画形式(MP4など)と、GASの実行時間制限に収まるファイルサイズであることを常に意識して動画を作成・準備してください。
- TikTok APIのドキュメントを参照する: より詳細なAPIの仕様や、利用可能な他のエンドポイントについて知りたい場合は、TikTok for Developersの公式ドキュメントを参照してください。
このシステムは、あくまでGoogleドライブから単一アカウントへの自動投稿の基本形です。これをベースに、様々な応用が考えられます。
- スプレッドシートで投稿スケジュールを管理: Googleスプレッドシートに投稿したい動画ファイルのファイル名、投稿日時、投稿先アカウント、キャプション、ハッシュタグなどの情報をリスト化し、GASスクリプトがその情報を読み取って投稿処理を行うように拡張できます。これにより、より柔軟なスケジュール管理が可能になります。
- 複数アカウントへの投稿振り分け: スプレッドシートで管理する情報に投稿先のアカウント情報を追加し、GASスクリプト内でアカウントごとに適切な認証情報を使用して投稿処理を振り分けることで、複数のTikTokアカウントへの自動投稿を実現できます。
- 動画ファイル名の規則化と自動キャプション生成: Googleドライブにアップロードする動画ファイル名に特定の規則(例:
[日付]_[タイトル]_[ハッシュタグ]
) を持たせることで、GASスクリプトがファイル名を解析し、投稿タイトルやキャプション、ハッシュタグを自動で生成するような処理を追加できます。 - 投稿完了通知: 投稿が成功または失敗した場合に、メールやSlackなどに通知を送る機能を実装することで、システムの稼働状況をリアルタイムで把握できます。
- 投稿後のファイル削除: 投稿が成功したファイルを別のフォルダに移動するのではなく、完全に削除することで、Googleドライブの容量を節約できます(ただし、バックアップが必要ない場合に限ります)。
これらの応用を実現するためには、GASのコードをさらに書き加える必要がありますが、一度基本形を構築できれば、これらの拡張も比較的容易に行えるはずです。あなたの運用ニーズに合わせて、ぜひカスタマイズに挑戦してみてください。
応用アイデア | 実現方法のヒント |
---|---|
スプレッドシート連携 | GASでSpreadsheetAppサービスを使用し、スプレッドシートのデータを読み書きする |
複数アカウント投稿 | アカウントごとにOAuth2認証プロセスを行い、アクセストークンを管理する。投稿時に適切なアクセストークンを使用する |
自動キャプション生成 | 正規表現などを使ってファイル名から情報を抽出し、APIリクエストのペイロードに含める |
投稿完了通知 | GASでMailAppまたはGmailAppサービスを使用してメールを送信する。Slack連携の場合はUrlFetchAppでIncoming Webhooksを呼び出す |
まとめ
本記事では、Google Apps Script (GAS) と TikTok Content Posting API を連携させ、Googleドライブに保存した動画をTikTokへ自動投稿するシステムの構築方法を詳しく解説しました。
1. **TikTok側の準備**: ビジネスアカウントへの切り替えと、TikTok for DevelopersでのAPI利用申請・審査通過が必須です。ここで取得するClient KeyとClient Secretは非常に重要です。
2. **GASプロジェクト準備**: 新しいGASプロジェクトを作成し、OAuth2ライブラリを追加します。
3. **コード記述と認証**: 提供したGASコードを貼り付け、設定値を変更します。`logAuthorizationUrl()`を実行して初回認証を行い、GASにTikTokへのアクセス権を付与します。
4. **テストと自動実行設定**: Googleドライブにテスト動画を置いて`postVideoToTiktok()`を手動実行して動作確認を行います。問題なければ、時間主導型トリガーを設定して自動実行を開始します。
APIの利用申請という最初のハードルは存在しますが、一度このシステムを構築してしまえば、日々のTikTok投稿作業にかかる時間と労力を大幅に削減し、あなたのコンテンツ運用を劇的に効率化できる非常に強力なツールとなります。
GASの実行時間制限やAPIの仕様変更リスクといった考慮事項はありますが、それらを理解し、適切な対策を講じることで、安定した運用が可能です。
今回ご紹介した基本形を参考に、ぜひあなたの具体的な運用ニーズに合わせてコードをカスタマイズし、さらなる効率化や機能拡張を目指してみてください。Google Apps ScriptとTikTok APIの組み合わせは、あなたのクリエイティブな活動やマーケティング戦略に、きっと新たな可能性をもたらしてくれるはずです。