Driveには同じ名前のファイルを複数置けます。「月次報告.pdf」を名前で検索して、見つかった最初の1件を正式な資料として扱うと、別の月や別の担当者のファイルを選ぶ可能性があります。
名前は人が探すための情報として使い、処理対象を確定するときはフォルダとファイルIDを確認します。名前から選ぶ必要がある場合も、0件と複数件を分け、1件だけに決まる条件を先に作ります。
名前の一致だけで先頭を採用しない
公式のFolder資料のgetFilesByNameはそのフォルダ内にある同名ファイルをFileIteratorで返します。1つのFileが返るメソッドではありません。
検索するフォルダのIDを明示すれば、Drive全体で同じ名前を探すより対象を狭められます。ただし、そのフォルダ内で名前が一意という保証はないため、件数の確認は残ります。サブフォルダを再帰的に調べる処理でもありません。
練習用フォルダに「確認用.txt」を1つ作り、IDを控えます。その後、同じ名前のファイルをもう1つ作って、複数件の場合に止まるかを試すと、検索条件の意味が分かります。実際の報告書を動かす必要はありません。
1件だけのIDを返す関数
2件目が見つかった時点でエラーにするので、同名ファイルすべてを一覧へ複写しません。更新や移動も行わず、対象の識別情報だけを返します。
function findUniqueNamedFile(folder, name) {
if (typeof name !== 'string' || name.trim() === '') {
throw new Error('ファイル名を指定してください');
}
const files = folder.getFilesByName(name);
if (!files.hasNext()) throw new Error('指定名のファイルがありません');
const file = files.next();
if (files.hasNext()) throw new Error('同名ファイルが少なくとも2件あります');
return {id: file.getId(), name: file.getName(), mimeType: file.getMimeType()};
}
function previewUniqueFile() {
const folder = DriveApp.getFolderById('練習用フォルダID');
console.log(JSON.stringify(findUniqueNamedFile(folder, '確認用.txt')));
}
1件ならそのID、名前、MIMEタイプが返る想定です。実際のIDをDriveで開いたファイルと照合してください。0件なら対象なし、2件以上なら複数件として止まります。先頭の1件を選んだふりで処理を続けません。
MIMEタイプと内容も照合する
同じ「確認用.txt」という名前でも、ファイルの種類や中身が目的に合うとは限りません。拡張子の文字だけで、実際の形式を決めないようにします。File資料のgetMimeTypeも確認の手がかりになります。
Driveのショートカットが対象なら、ショートカット本体と参照先も別です。名前が一致するだけで、そのIDをそのまま内容の読み取りへ渡せるとは限りません。対象の種類を確認してから、次の処理を選びます。
実際に正式な資料を特定する業務では、対象月や版、管理番号などの条件も必要になります。名前の末尾へ自動で「最新」と付けて判断するより、元の台帳に確定したファイルIDを残す方法も検討できます。
検索後の変更に注意する
ファイルIDは同じ名前の別ファイルと区別するために使えます。ただし、そのファイルの内容が後から変更されないことを保証する値ではありません。読み取った内容の更新日時や対象期間が必要なら、IDと一緒に確認します。
共有権限や保存先が変われば、同じIDでも次回の実行で読めなくなる場合があります。対象が見つからないときに、同じ名前の別ファイルへ自動で切り替えると、間違った資料を採用する可能性があります。
ローカルでは代用のFileIteratorで1件・0件・複数件・空の名前を確認しました。Driveの検索や権限変更は未実行です。移動や命名を追加する前にDrive整理の基本を確認し、閲覧範囲はGASの共有と権限と分けて点検してください。
