Google Apps ScriptでGoogle Drive上のMP4ファイル名を一括変更する方法
Google Driveを日常的に使っていると、ファイルの整理は避けられない作業です。特に、同じ種類のファイルが大量にある場合、手作業での名前変更は非常に手間がかかります。例えば、YouTube Shorts用の動画ファイルをたくさん作成している場合、ファイル名に特定のタグを付けたいことがあるかもしれません。
この記事では、Google Apps Script(GAS)を使って、Google Drive上の特定のフォルダにあるMP4ファイルに対し、特定の文字列がファイル名に含まれていない場合に、指定した文字列を自動的に追加する方法を解説します。提供されたスクリプトコードを基に、その仕組み、使い方、そして応用方法まで詳しく見ていきましょう。
GASを使ったファイル操作の自動化は、一度設定すれば手作業から解放される強力な手段です。プログラミング初心者の方でも理解できるように、丁寧に解説していきますので、ぜひ最後までお読みください。
コードの概要と目的
今回扱うGASスクリプトは、以下の目的を達成します。
- 指定されたGoogle Driveフォルダを取得する。
- そのフォルダ内にあるファイルの中から、MP4ファイルのみを抽出する。
- 各MP4ファイルのファイル名に、特定の文字列(例:
#Shorts
)が既に含まれているか確認する。 - 含まれていない場合、指定した文字列(例:
受験頑張れ! #Shorts
)をファイル名の拡張子前に追加して、ファイル名を変更する。 - 処理の状況や結果をログに出力する。
このスクリプトは、例えば「YouTubeにアップロードする前に、特定のキャンペーンを示すタグをファイル名に一括で追加したい」「Shortsとして認識させるための #Shorts
を漏れなくファイル名に入れたい」といった場合に役立ちます。手作業では面倒な繰り返し作業を、スクリプトに任せることで、効率化とミスの削減が期待できます。
個人情報を除いたプログラムを通しでコピペしやすいように書いて
以下に、今回の解説で使用するGoogle Apps Scriptのコードを示します。このコードをGASエディタに貼り付けて使用します。
/**
* 指定されたフォルダ内のMP4ファイルの名前を変更します。
* ファイル名に「 #Shorts」が含まれていない場合、
* 「 受験頑張れ! #Shorts」を拡張子の前に追加します。
*/
function renameMp4FilesWithCheerMessage() {
const FOLDER_ID = "YOUR_FOLDER_ID_HERE"; // 対象のフォルダIDに置き換えてください
const SUFFIX_TO_CHECK = " #Shorts"; // この文字列が既に存在するかチェック
const SUFFIX_TO_ADD = " 受験頑張れ! #Shorts"; // 追加する文字列(先頭にスペースあり)
const FILE_EXTENSION = ".mp4";
try {
const folder = DriveApp.getFolderById(FOLDER_ID);
if (!folder) {
Logger.log(`エラー: 指定されたフォルダが見つかりません。ID: ${FOLDER_ID}`);
return;
}
// フォルダ内のMP4ファイルのみを取得
const mimeTypeString = "video/mp4"; // MIMEタイプを指定
Logger.log(`対象フォルダ「${folder.getName()}」内の${mimeTypeString}ファイルを処理します...`);
const files = folder.getFilesByType(mimeTypeString);
if (!files.hasNext()) {
Logger.log(`対象フォルダに${mimeTypeString}ファイルが見つかりませんでした。`);
return;
}
while (files.hasNext()) {
const file = files.next();
let originalName = file.getName();
Logger.log(`処理中のファイル: ${originalName}`);
// 拡張子が指定のものであるかチェック(大文字小文字を区別しない)
if (!originalName.toLowerCase().endsWith(FILE_EXTENSION.toLowerCase())) {
Logger.log(`スキップ: ${originalName} (拡張子が${FILE_EXTENSION}ではありません)`);
continue;
}
// 拡張子を除いたファイル名を取得
let nameWithoutExtension = originalName.substring(0, originalName.lastIndexOf(FILE_EXTENSION));
// 追加したい文字列が既に含まれているかチェック
if (nameWithoutExtension.endsWith(SUFFIX_TO_CHECK)) {
Logger.log(`スキップ: ${originalName} (既に「${SUFFIX_TO_CHECK}」が含まれています)`);
continue;
}
// 新しいファイル名を生成
let newName = nameWithoutExtension + SUFFIX_TO_ADD + FILE_EXTENSION;
try {
// ファイル名を変更
file.setName(newName);
Logger.log(`名前を変更しました: "${originalName}" -> "${newName}"`);
} catch (e) {
Logger.log(`ファイル名の変更に失敗: "${originalName}". エラー: ${e.toString()}`);
}
}
Logger.log("すべてのファイルの処理が完了しました。");
} catch (e) {
Logger.log(`スクリプト実行中に予期せぬエラーが発生しました: ${e.toString()}`);
if (e.stack) {
Logger.log(`スタックトレース:\n${e.stack}`);
}
}
}
// 実行前に上の FOLDER_ID を適切なフォルダIDに置き換えてください。
// テストデータ作成関数(必要に応じて使用してください)
function setupTestData() {
const FOLDER_ID = "YOUR_FOLDER_ID_HERE"; // 対象のフォルダIDに置き換えてください
const folder = DriveApp.getFolderById(FOLDER_ID);
if (!folder) {
Logger.log(`テストデータ作成失敗: フォルダが見つかりません ID ${FOLDER_ID}`);
return;
}
// 既にファイルが存在する場合は実行に注意
try {
folder.createFile("テスト動画1.mp4", "dummy content", "video/mp4");
folder.createFile("テスト動画2 #Shorts.mp4", "dummy content", "video/mp4");
folder.createFile("Another Video.mp4", "dummy content", "video/mp4");
folder.createFile("Final Video #Shorts.mp4", "dummy content", "video/mp4");
folder.createFile("not_an_mp4.txt", "dummy text", MimeType.PLAIN_TEXT); // MP4ではないファイル
Logger.log("テストデータを作成しました。");
} catch (e) {
Logger.log(`テストデータ作成中にエラーが発生しました: ${e.toString()}`);
}
}
重要: 上記コードの FOLDER_ID
を、実際に処理したいGoogle DriveフォルダのIDに置き換えてください。フォルダIDは、Google Driveで対象フォルダを開いたときのURLの /folders/
の後ろにある文字列です。
例: https://drive.google.com/drive/folders/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
の xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
の部分。
主要な機能とロジック解説
このスクリプトの主要な部分を分解して見ていきましょう。
-
定数の定義:
javascript
const FOLDER_ID = "YOUR_FOLDER_ID_HERE";
const SUFFIX_TO_CHECK = " #Shorts";
const SUFFIX_TO_ADD = " 受験頑張れ! #Shorts";
const FILE_EXTENSION = ".mp4";
ここで、対象フォルダのID、チェックしたい文字列、追加したい文字列、対象のファイル拡張子を定数として定義しています。コードの変更が必要になったときに、この部分だけを修正すれば済むため、管理しやすくなります。 -
フォルダの取得:
javascript
const folder = DriveApp.getFolderById(FOLDER_ID);
if (!folder) {
Logger.log(`エラー: 指定されたフォルダが見つかりません。ID: ${FOLDER_ID}`);
return;
}
DriveApp.getFolderById()
メソッドを使って、指定したIDのフォルダを取得します。もしIDが間違っている、または存在しない場合、folder
はnull
になります。したがって、取得できなかった場合にエラーメッセージをログに出力して処理を終了するエラーハンドリングが行われています。 -
MP4ファイルの取得:
javascript
const mimeTypeString = "video/mp4";
const files = folder.getFilesByType(mimeTypeString);
ここで、フォルダ内のファイルからMIMEタイプが"video/mp4"
のものだけを絞り込んで取得します。getFilesByType()
は、取得されたファイルを一つずつ取り出すためのイテレーターを返します。これは大量のファイルを扱う際にメモリ効率が良い方法です。 -
ファイルのイテレーションと処理:
javascript
while (files.hasNext()) {
const file = files.next();
let originalName = file.getName();
// ... ファイル名チェックと変更のロジック ...
}
while (files.hasNext())
ループは、取得したファイルのリスト(イテレーター)に次のファイルがある限り繰り返されます。files.next()
で次のファイルオブジェクトを取得し、その名前を取得します。 -
ファイル名と拡張子のチェック:
javascript
if (!originalName.toLowerCase().endsWith(FILE_EXTENSION.toLowerCase())) {
// ... スキップ処理 ...
continue;
}
ここで、取得したファイル名が指定した拡張子で終わっているかを確認します。toLowerCase()
を使っているのは、例えばファイル名がVideo.MP4
のように大文字の場合でも正しく判定できるようにするためです。拡張子がない、あるいは違う場合は処理をスキップします。 -
既存文字列のチェック:
javascript
let nameWithoutExtension = originalName.substring(0, originalName.lastIndexOf(FILE_EXTENSION));
if (nameWithoutExtension.endsWith(SUFFIX_TO_CHECK)) {
// ... スキップ処理 ...
continue;
}
まず、substring()
とlastIndexOf()
を使ってファイル名から拡張子を取り除きます。次に、拡張子を除いたファイル名の末尾が、追加したい文字列(SUFFIX_TO_CHECK
)と一致するかを確認します。既に含まれている場合は、二重に追加しないようにスキップします。 -
新しいファイル名の生成と変更:
javascript
let newName = nameWithoutExtension + SUFFIX_TO_ADD + FILE_EXTENSION;
try {
file.setName(newName);
Logger.log(`名前を変更しました: "${originalName}" -> "${newName}"`);
} catch (e) {
Logger.log(`ファイル名の変更に失敗: "${originalName}". エラー: ${e.toString()}`);
}
ファイル名の変更が必要な場合、元のファイル名(拡張子なし)に指定した文字列 (SUFFIX_TO_ADD
) と拡張子を結合して新しいファイル名を生成します。そして、file.setName()
メソッドでファイル名を変更します。この操作中にエラーが発生する可能性もあるため、ここでもtry...catch
ブロックを使って個別のエラーを補足し、ログに出力しています。 -
全体のエラーハンドリング:
スクリプト全体もtry...catch
ブロックで囲まれています。これにより、ファイル取得やその他の予期せぬエラーが発生した場合でも、スクリプトが突然停止するのではなく、エラーメッセージをログに出力して終了することができます。
使用されている技術・ライブラリ
このスクリプトは、主に以下の技術要素から構成されています。
- Google Apps Script (GAS): Google Workspaceの各種サービス(Google Drive, Spreadsheet, Gmailなど)を操作するためのJavaScriptベースのスクリプト環境です。Googleのサーバー上で実行されるため、ローカル環境のセットアップは不要です。
- Google Drive Service: GASが提供する組み込みサービスの一つで、Google Drive上のファイルやフォルダを作成、読み取り、更新、削除(CRUD操作)するための豊富なメソッドを提供します。今回のスクリプトでは
DriveApp
クラスとそのメソッド(getFolderById
,getFilesByType
)を主に使用しています。 - 標準JavaScript: 変数宣言 (
const
,let
)、ループ (while
)、条件分岐 (if
)、文字列操作メソッド (toLowerCase
,endsWith
,substring
,lastIndexOf
)、エラーハンドリング (try...catch
) など、JavaScriptの基本的な構文と組み込み関数が使用されています。 - Logger Service: GASでデバッグ情報を出力するためのサービスです。
Logger.log()
を使うことで、スクリプトの実行中に変数の中身や処理の進捗を確認できます。実行後、「ログを表示」から確認できます。
GASとGoogle Drive Serviceを組み合わせることで、Google Drive上での定型的なファイル管理作業を簡単に自動化できることがわかります。
セットアップと実行方法
スクリプトを実行するための手順は以下の通りです。
-
Google Apps Script プロジェクトの作成:
- Google Driveを開きます。
- 「+ 新規」ボタンをクリックし、「その他」>「Google Apps Script」を選択します。
- スクリプトエディタが開きます。プロジェクト名は任意で設定してください(例: 「Driveファイル名変更スクリプト」)。
-
コードの貼り付け:
- 前述の「個人情報を除いたプログラムを通しでコピペしやすいように書いて」セクションにあるコードをコピーし、スクリプトエディタに貼り付けます。既存のコード(
myFunction
など)は削除して構いません。
- 前述の「個人情報を除いたプログラムを通しでコピペしやすいように書いて」セクションにあるコードをコピーし、スクリプトエディタに貼り付けます。既存のコード(
-
フォルダIDの置き換え:
- コード内の
const FOLDER_ID = "YOUR_FOLDER_ID_HERE";
の部分を、実際にファイル名変更を行いたいGoogle DriveフォルダのIDに置き換えます。この手順は必ず行ってください。 間違ったIDやデフォルトのままではスクリプトは動作しません。 - 必要に応じて、
SUFFIX_TO_CHECK
とSUFFIX_TO_ADD
の値も、目的に合わせて変更してください。
- コード内の
-
テストデータの作成(任意):
- もし実際のファイルを操作する前に動作を確認したい場合は、
setupTestData
関数もコードに含めておき、GASエディタの関数選択ドロップダウンからsetupTestData
を選んで一度実行してみてください。指定したフォルダ内にテスト用のファイルがいくつか作成されます。ただし、この関数はフォルダ内に同名のファイルが存在するとエラーになる場合がありますので注意してください。
- もし実際のファイルを操作する前に動作を確認したい場合は、
-
スクリプトの実行:
- GASエディタの上部にある関数選択ドロップダウンから
renameMp4FilesWithCheerMessage
を選択します。 - ▶(実行)ボタンをクリックします。
- 初回実行時には、スクリプトがGoogle Driveにアクセスするための承認を求められます。「権限を確認」をクリックし、表示されるダイアログに従って、このスクリプトがあなたのGoogle Drive上のファイルを表示・編集・作成・削除する権限を許可してください。これはスクリプトがファイル名を変更するために必要な操作です。
- GASエディタの上部にある関数選択ドロップダウンから
-
実行結果の確認:
- スクリプトの実行が完了すると、エディタ下部または「実行ログを表示」からログを確認できます。ファイルが正常に変更されたか、エラーが発生したかなどが記録されています。
使用例・応用例
このスクリプトで実現できることや、少し変更するだけで可能になる応用例をいくつか紹介します。
- YouTube Shorts動画の一括整理: 多数のShorts動画ファイルをまとめて特定のフォルダに保存している場合に、ファイル名に
#Shorts
タグが漏れなく付いているかを確認し、必要に応じて追加する作業を自動化できます。 - 特定のキャンペーンやイベント用動画のタグ付け: 例えば、ある期間限定キャンペーン用の動画ファイル群に、キャンペーン名を示す文字列(例:
Summer2024_Promo_
)をファイル名の先頭に追加するなど、ファイル名による分類・識別を強化できます。 - 他のファイルタイプへの応用:
FILE_EXTENSION
とmimeTypeString
の値を変更すれば、MP4ファイルだけでなく、画像ファイル (.jpg
,.png
,image/jpeg
,image/png
) や音声ファイル (.mp3
,audio/mpeg
) など、他の種類のファイルに対しても同様のファイル名変更処理を適用できます。 - 特定のキーワードを含むファイルの抽出と処理:
endsWith()
の代わりにindexOf()
や正規表現 (match()
,test()
) を使えば、ファイル名の中に特定のキーワードが含まれているファイルを抽出して処理する、といったより複雑な条件設定も可能です。 - 定期的なメンテナンス作業: 時間主導型トリガーを設定すれば、特定のフォルダのファイル名を毎日、毎週といった間隔で自動的にチェックし、必要に応じて変更するメンテナンス作業を自動化することもできます。
学習者向けのポイント・発展的なトピック
GASやGoogle Drive Serviceをこれから学びたいという方にとって、このスクリプトは良い出発点となります。以下の点に着目して学習を進めると良いでしょう。
- Google Drive Serviceの基本:
DriveApp
クラスの他にも、ファイルやフォルダを操作する様々なメソッドがあります。ファイル作成 (createFile
)、コピー (makeCopy
)、移動 (moveTo
)、削除 (setTrashed
) など、公式ドキュメントを参照して他の機能も試してみてください。 - MIMEタイプ: ファイルの種類を指定するMIMEタイプについて理解を深めましょう。
MimeType
enum を使うこともできますが、今回のコードのように文字列で指定する場合も多いです。 - イテレーター:
hasNext()
とnext()
を使ったイテレーターの扱いは、GASでファイルやスプレッドシートのセルなどを大量に処理する際によく使われるパターンです。 - 文字列操作: JavaScriptの標準的な文字列メソッド(
toLowerCase
,endsWith
,substring
,lastIndexOf
など)は、ファイル名だけでなく様々なテキストデータを処理する上で非常に重要です。 - エラーハンドリング:
try...catch
ブロックの使い方を学び、スクリプトがエラーで停止しないように堅牢性を高めましょう。特定のエラーに応じて処理を分岐させることも可能です。 - GASトリガー: 時間主導型トリガーやイベントトリガー(例: スプレッドシートのセル編集時、フォーム送信時)を使えば、スクリプトを自動実行できます。これにより、完全に自動化されたワークフローを構築できます。
- GASの公式ドキュメント: 最も信頼できる情報源は、Google Apps Scriptの公式ドキュメントです。各サービスの詳しい説明や利用可能なメソッドが網羅されています。
まとめ
この記事では、Google Apps Scriptを使ってGoogle Drive上のMP4ファイル名を自動的に変更するスクリプトを解説しました。特定のフォルダからMP4ファイルを抽出し、ファイル名に特定の文字列がなければ指定した文字列を追加するという、比較的単純ながらも実用的な処理を自動化できることを示しました。
GASとGoogle Drive Serviceを組み合わせることで、Google Driveでの定型的なファイル管理作業を効率化し、手作業によるミスを減らすことが可能です。今回紹介したスクリプトをベースに、ファイルの種類、追加・チェックする文字列、処理の条件などを変更することで、様々なファイル名規則の適用や整理作業に応用できます。
ぜひ、このスクリプトを試してみて、GASによる自動化の世界に触れてみてください。最初は小さなスクリプトから始めて、徐々に複雑な処理に挑戦していくことで、Google Workspaceをさらに便利に活用できるようになるはずです。