📸
Google App ScriptでGoogle Drive内のファイルを表管理
課題
- テスト業務中、実行結果の証跡残しなどをGoogle Driveに残しておく必要があったが管理が大変だった。
- 証跡とり忘れ,確認,etc...
目的
Google App Script(GAS)を用いて、Google Drive(以下、ドライブ)にあるファイル名,URL,...などを一覧化する。また、必要な証跡の有無を都度チェックする。



準備
- ドライブにフォルダを作成(ここでは名前をevidenceとする)
- ドライブのURLに注目
https://drive.google.com/drive/folders/${folderID}
URLのfolders/以降がフォルダIDとなる。 - 任意の場所にGoogleスプレッドシートを作成し、シート1の名前を「ファイル一覧」、シート2の名前を「必要エビデンス」とする。
- シート画面の上部の「拡張機能」->「Apps Script」
からGASを書ける
エビデンス起票スクリプト
function checkNewFilesRecursive() {
// ファイルを収集
function collectFilesRecursive(folder, currentPath, fileList) {
var folderPath = currentPath ? currentPath + "/" + folder.getName() : folder.getName();
var files = folder.getFiles();
while (files.hasNext()) {
var file = files.next();
fileList.push({
id: file.getId(),
name: file.getName(),
url: file.getUrl(),
lastUpdated: Utilities.formatDate(file.getLastUpdated(), Session.getScriptTimeZone(), "yyyy/MM/dd HH:mm:ss"),
size: file.getSize(),
path: folderPath
});
}
// サブフォルダ
var subfolders = folder.getFolders();
while (subfolders.hasNext()) {
collectFilesRecursive(subfolders.next(), folderPath, fileList);
}
}
var folderId = "1I0pM5a2moSvlDT1BhCQTc20g1F-pVweU"; // 対象フォルダID
var folder = DriveApp.getFolderById(folderId);
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ファイル一覧");
if (!sheet) {
sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("ファイル一覧");
sheet.appendRow(["ファイルID", "ファイル名", "URL", "更新日", "サイズ(Bytes)", "フォルダパス"]);
}
// シートの既存データ取得
var lastRow = sheet.getLastRow();
var existingData = [];
if (lastRow > 1) {
existingData = sheet.getRange(2, 1, lastRow - 1, 6).getValues();
}
// シート上のファイルIDマップ
var existingMap = {};
existingData.forEach((row, index) => {
existingMap[row[0]] = index + 2; // シート行番号(ヘッダー1行を考慮)
});
// Driveの全ファイルを収集
var driveFiles = [];
collectFilesRecursive(folder, "", driveFiles);
// Drive上のIDセット
var driveIds = driveFiles.map(f => f.id);
// 削除されたファイルはシートから削除
for (var i = existingData.length - 1; i >= 0; i--) {
if (driveIds.indexOf(existingData[i][0]) === -1) {
sheet.deleteRow(i + 2);
}
}
// 追加または更新
driveFiles.forEach(f => {
if (existingMap[f.id]) {
// 更新された場合は上書き
sheet.getRange(existingMap[f.id], 2, 1, 5).setValues([[
f.name,
f.url,
f.lastUpdated,
f.size,
f.path
]]);
} else {
// 新規追加
sheet.appendRow([f.id, f.name, f.url, f.lastUpdated, f.size, f.path]);
}
});
Logger.log("Driveとシートの同期完了");
}
ファイルチェック
function checkEvidenceMarkNoExt() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var driveSheet = ss.getSheetByName("ファイル一覧"); // Drive同期済み
var evidenceSheet = ss.getSheetByName("必要エビデンス"); // エビデンスチェック用
if (!driveSheet || !evidenceSheet) {
SpreadsheetApp.getUi().alert("シートが存在しません。名前を確認してください。");
return;
}
// Drive上のファイル名リスト取得(拡張子なし)
var lastRowDrive = driveSheet.getLastRow();
var driveFiles = [];
if (lastRowDrive > 1) {
driveFiles = driveSheet.getRange(2, 2, lastRowDrive - 1, 1).getValues().flat()
.map(name => name.replace(/\.[^/.]+$/, "")); // 拡張子を除去
}
// 必要エビデンスリスト取得(拡張子なしで比較)
var lastRowEvidence = evidenceSheet.getLastRow();
if (lastRowEvidence < 1) return;
var evidenceList = evidenceSheet.getRange(2, 1, lastRowEvidence - 1, 1).getValues();
// 判定結果作成
var results = evidenceList.map(function(row) {
var fileName = row[0];
if (!fileName) return [""]; // 空白は空白のまま
var baseName = fileName.replace(/\.[^/.]+$/, ""); // 拡張子除去
return [driveFiles.includes(baseName) ? "〇" : "✖"];
});
// 2列目に結果を書き込み
evidenceSheet.getRange(2, 2, results.length, 1).setValues(results);
}
定期実行
トリガー⇒時間ベース を設定することで、起票&チェックを定期実行してくれます!
Discussion