Driveのフォルダで資料を見つけても、その項目がショートカットなら、取得したIDは資料本体のIDとは違います。GASでそのまま読み取りへ渡す前に、項目のMIMEタイプと、参照先のIDを分けて確認します。
ショートカットへアクセスできることと、参照先の資料を読めることも別です。ショートカットを解決するコードで、共有権限まで得られるわけではありません。まず練習用の1件から、どのIDを使っているかを確認します。
本体と参照先のIDを分ける
ショートカットのMIMEタイプはapplication/vnd.google-apps.shortcutです。通常のPDFなどと同じFileとして見つかるため、ファイル名や拡張子だけで判断しないようにします。
公式のFile資料には、参照先を取得するgetTargetId、getTargetMimeType、getTargetResourceKeyがあります。通常のファイルなら、参照先の情報はnullになります。
リンク共有の資料には、追加のresource keyが必要な場合があります。参照先のIDだけを渡して開けないときに、勝手に共有設定を広げる前に、この条件も確認します。resource keyはアクセス権を不要にするものではありません。
参照先を取得する関数
次の関数は通常のファイルならそのまま返し、ショートカットなら参照先を読み取ります。参照先のIDがない場合は、元のショートカットを資料本体として返さずに止めます。
function resolveDriveFile(file, drive) {
if (file.getMimeType() !== 'application/vnd.google-apps.shortcut') {
return file;
}
const targetId = file.getTargetId();
if (!targetId) throw new Error('ショートカットの参照先IDがありません');
const key = file.getTargetResourceKey();
return key ? drive.getFileByIdAndResourceKey(targetId, key)
: drive.getFileById(targetId);
}
function previewShortcutTarget() {
const source = DriveApp.getFileById('練習用ショートカットID');
const target = resolveDriveFile(source, DriveApp);
console.log(JSON.stringify({
sourceId: source.getId(), targetId: target.getId(),
targetMimeType: target.getMimeType()
}));
}
練習用の資料へショートカットを作り、sourceIdとtargetIdが別であることを確認します。通常ファイルのIDを指定した場合は、両方が同じIDになります。ログにresource keyや資料の本文は出しません。
開けない場合の確認
公式のDriveAppでは、getFileByIdAndResourceKeyも、ファイルが存在しない場合や利用者に権限がない場合は例外になると説明されています。キーがあるから開けると決めつけず、実行アカウントのアクセス範囲を確認します。
ショートカットを置いたフォルダの共有設定だけでは、参照先ファイルの権限が同じとは限りません。別アカウントで使うツールなら、そのアカウントが参照先を直接開けるかも確かめます。
参照先が削除された、権限が変わった、別の保存場所へ整理された、といった可能性もあります。同じ名前の資料を自動で探して代用すると、違う資料を採用するおそれがあります。元のIDと参照先IDを控え、原因を確認してから設定を直します。
一覧処理へ広げる前に
ショートカットの解決後は、同じ資料へ複数のショートカットが向いている可能性があります。資料本体を1回ずつ処理したいなら、ショートカットのIDだけでなく、取得した本体のIDでも重複を確認します。
この例は参照先を1段調べるもので、Driveの全項目をたどったり、内容を書き換えたりはしません。公式のショートカットの説明と照合し、目的の資料形式だけを後続処理へ渡すようにします。
ローカルの代用FileとDriveで、通常ファイル、キーあり・なし、参照先なし、権限例外を確認しました。Google上の共有やresource keyの実動作は未実行です。Drive整理の基本とGASの共有範囲を基に、読み取る対象を確かめてください。
