LoginSignup
8
5

More than 5 years have passed since last update.

gasを使ってDriveのフォルダーコピー&ファイルのURL一覧取得

Last updated at Posted at 2017-07-23

環境

2017/7/23時点の Google Apps Script

はじめに

普段やっていること

業務で施策毎に以下のような作業を行っています。

  • Drive上で施策ごとにフォーマットディレクトリをコピーする。
    • 仕様書、設計などをまとめる書類のフォーマットファイルがある。
  • 各ファイルのURLを取得してチケットに貼り付ける。

▽こんな感じのファイル管理です
スクリーンショット 2017-07-23 10.35.53.png

問題

Google Driveはディレクトリのコピーに対応していません。そのため手動で以下を行う必要がありました。面倒!!

  • フォーマットのファイルをコピーする。
  • フォルダーを作成する。
  • コピーしたファイルを作成したフォルダーに移す。
  • フォルダーと各ファイルの名前を1つずつ変更する。
  • 各ファイルのURLを1つずつ取得してチケットに貼り付ける。

解決方法

下記の手順に圧縮するためのgasを作成しました。

  • getFeatureName関数にプロジェクト名を指定する。
  • gasを実行する。
  • テキストからURL一覧をコピーしてチケットに貼り付ける。

先にまとめ


/* 
・使い方
getFeatureName に名前をつけて startCopy 実行します。

・成果物
フォーマットフォルダ内をコピーした新規フォルダを作成し、すべてのURLを記載したテキストを出力します。
ログにテキストのURLを出力します。
*/

// 施策名を取得する
function getFeatureName(){
  return "サンプル施策";
}

//この関数を実行する
function startCopy() {
  var parentFolder = DriveApp.getFolderById(getFolderId("Parent"));
  var sourceFolder = DriveApp.getFolderById(getFolderId("Source"));
  var createdFolder = parentFolder.createFolder(getFeatureName());

  // フォルダの中身をコピー
  folderCopy(sourceFolder, createdFolder);    
  // URL一覧のテキスト作成
  createFileDescribedAllURL(createdFolder);
  // ファイル名に施策名をつける
  setFeatureNameToFiles(createdFolder);
}

// フォルダーのIDを取得する 定数管理用
function getFolderId(type){
  switch(type){
    case "Source":
      // フォーマットとなるディレクトリのID
      return "aaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    case "Parent":
      // 作成したフォルダを置くディレクトリのID
      return "aaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  }
}

// sourceFolder 内のファイルを createdFolder にコピーする
function folderCopy(sourceFolder, createdFolder) {
  var sourceFiles = sourceFolder.getFiles();
  while(sourceFiles.hasNext()) {
    var sourceFile = sourceFiles.next();
    sourceFile.makeCopy(sourceFile.getName(), createdFolder);
  }
}

// フォルダ内にあるファイルのURLを列挙したテキストファイルを作成する
function createFileDescribedAllURL(createdFolder){
  var createdFiles = createdFolder.getFiles();
  var text = "";
  while(createdFiles.hasNext()){
    var file = createdFiles.next();
    var fileName = file.getName();
    text += "" + fileName + "\n";
    text += file.getUrl() + "\n";
    text += "\n";
  }
  if(text == null){
    return;
  }
  var textFile = createdFolder.createFile("url一覧", text, MimeType.PLAIN_TEXT);
  Logger.log(textFile.getUrl()); // ログにテキストのURLを出力する
}

// フォルダ内にあるファイルの頭に「施策名_」を追加する
function setFeatureNameToFiles(createdFolder){
  var createdFiles = createdFolder.getFiles();
  while(createdFiles.hasNext()){
    var file = createdFiles.next();
    var fileName = file.getName();
    file.setName(getFeatureName() + "_" + fileName);
  }
}

▽ログにURL一覧テキストへのURL出力
スクリーンショット 2017-07-23 10.54.58.png

▽URL一覧テキスト
スクリーンショット 2017-07-23 10.56.01.png

▽作成されたフォルダ内
スクリーンショット 2017-07-23 11.43.28.png

解説

ディレクトリを特定するためにIDを指定する

getFolderId にDriveのフォルダーIDを指定して使います。一度設定したら固定の運用イメージです。
IDを指定する理由は下記の2点です。

  • 同じ名前が認められている。
    • そのため名前検索だと複数ヒットすることがあり、どれを使えば良いかわからなくなる。
  • フォルダーは単にリンクを持っているだけ。
    • 1つのファイルに複数の親ディレクトリということがありうる。
    • そのため、ファイルの名前や形式から特定しづらい。

ディレクトリのコピーは別

// sourceFolder 内のファイルを createdFolder にコピーする
function folderCopy(sourceFolder, createdFolder) {
  var sourceFiles = sourceFolder.getFiles();
  while(sourceFiles.hasNext()) {
    var sourceFile = sourceFiles.next();
    sourceFile.makeCopy(sourceFile.getName(), createdFolder);
  }
}

ここで行っているのはファイルのコピーのみです。
フォルダーもコピーしたいのであれば
sourceFolder.getFolders()した結果を回す必要があります。

さいごに

今の状態だと完全にエンジニアが使う前提です。しかし、書類はディレクターやプランナーが管理をしていることが多いです。もしGUIを作るのであればスプレッドシートを使えば良いと思います。施策名やIDの入力はセルに書いてもらえばよいし、結果はBrowserクラスで表示してあげれば親切です。ネタが切れたら作るかも...

8
5
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
8
5