0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Google Drive内のデータを検索してコピーしたデータを任意のフォルダに置くGAS

0
Posted at

事務業務をしていると
「たくさんのファイルを添付して申請しなきゃいけない」のような事象によく見舞われ
探しているファイルは特定の場所にあったり、なかったり、、、
そのファイルを集めるのが大変という困り事がありました

この困り事を少し解決してくれた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);
  }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?