事務業務をしていると
「たくさんのファイルを添付して申請しなきゃいけない」のような事象によく見舞われ
探しているファイルは特定の場所にあったり、なかったり、、、
そのファイルを集めるのが大変という困り事がありました
この困り事を少し解決してくれたGASのスクリプトを紹介します
機能紹介
特定の文字列でGoogleDrive内を検索
ヒットした1件目のファイルをコピーして指定のフォルダ内に置く
検索対象は複数個指定可能
ファイルの重複は無視する
補足
実際の運用状況が、検索対象であるファイルはファイル名に重複なしのIDが振ってあり
検索文字列をIDにすることで、希望のファイルがコピーされてきました。
すべての職場が↑の状況とも限らないのでこの点だけ留意して参考にしてください。
全体のコード
LIST_SHEET_FILE_ID = '(検索文字列が記載されたシートID)';
LIST_SHEET_NAME = '(検索文字列が記載されたシート名)';
FOLDER_SHEET_NAME = '(保存先のフォルダURLが記載されたシート名)';
FOLDER_URL_CELL = '(保存先のフォルダURLが記載されたセル番号)'
// FOLDER_URL= '(保存先のフォルダURL)'
// 実行関数
function myFunction() {
// ファイルの置き先のフォルダIDを取得
const targetFolderId = getFolderIdByUrl();
// 検索文字列を取得
const sheetDataArray = getSheetData();
// 検索文字列ごとに検索をして、対象フォルダに置く
for (sheetData of sheetDataArray) {
copyfile(searchFile(sheetData), targetFolderId);
}
}
// URLをparseしてID部分を取得
function getFolderIdByUrl() {
const url = getTargetFolderUrl();
try {
const [regex, match] = url.match(/folders\/(.+)/);
if (match === '') {
throw new Error('folder idが取得できませんでした');
}
return match;
} catch(e) {
console.error('フォルダーIDの取得に失敗しました: ' + e);
}
}
// シートからフォルダURLを抜いてくる
function getTargetFolderUrl() {
try {
const sheet = SpreadsheetApp.openById(LIST_SHEET_FILE_ID).getSheetByName(FOLDER_SHEET_NAME);
// URLが記載されたセル番号を指定
return sheet.getRange(FOLDER_URL_CELL).getValue();
// return FOLDER_URL // シートから取得せずに環境変数から取得しても良さそう
} catch(e) {
console.error('シート取得に失敗しました: ' + e);
}
}
// スプレッドシートから検索文字列一覧の取得
function getSheetData() {
const rangeValuesArrayList = (() => {
try {
const sheet = SpreadsheetApp.openById(LIST_SHEET_FILE_ID).getSheetByName(LIST_SHEET_NAME);
// A列で書かれた検索文字一覧を取得
return sheet.getDataRange().getValues();
} catch(e) {
console.error('シート取得に失敗しました: ' + e);
}
})();
const dataArray =[];
for (rangeValueArray of rangeValuesArrayList) {
if (rangeValueArray[0] === '') {
break;
}
dataArray.push(rangeValueArray[0]);
}
return dataArray;
}
function searchFile(title) { // ファイル名をパラメータにしてファイルを取得(1件目)
const searchParam = `title contains "`+ title + `"`;
try {
const searchedFiles = DriveApp.searchFiles(searchParam);
const file = searchedFiles.next();
const getFile = DriveApp.getFileById(file.getId());
Logger.log('ファイル検索に成功しました: '+ getFile);
return getFile;
} catch(e) {
console.error('ファイル検索に失敗しました: ' +e);
}
}
// 渡されたファイルをコピーして指定フォルダに置く
function copyfile(file,tagetFolderId) {
try {
const setFolder = DriveApp.getFolderById(tagetFolderId); // コピーファイルの置き先
const setFile = file.makeCopy(setFolder)
Logger.log('ファイルコピーに成功しました: '+ setFile);
return setFile;
} catch(e) {
console.error('ファイルのコピーに失敗しました: ' + e);
}
}