LANG SELRCT

コードを書く場所

2019年6月13日木曜日

ファイルを指定フォルダにコピーしたい(UI)


シートやドキュメントだけなら
ファイルをコピーして指定フォルダに入れる
でできますが


スクリプトファイルもコピーできるようにしたい場合は
スクリプトファイルをコピーして指定したフォルダに入れる
のように工夫が必要です


ここではスクリプトファイルにも対応したコードを書き残しました


「Copy」をクリックしたあとに、作成されたコピーファイルのURLも表示します


こういうUIを作りたい



それを作るコード

コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile('index');
}

function copyFileToFolder(file_id, folder_id) {
  var file = DriveApp.getFileById(file_id);
  var copy_file = makeCopyToMydrive(file);
  removeFile(copy_file.getId(), folder_id);
  return copy_file.getUrl();
}

function makeCopyToMydrive(file) {
  var copy_file_name = "Copy of " + file.getName() + formatDate() + ' ' + Session.getActiveUser().getEmail();
  var copy_file = file.makeCopy(copy_file_name);
  return copy_file;
}

function removeFile(file_id, folder_id){
  var target_folder = DriveApp.getFolderById(folder_id);
  var file = DriveApp.getFileById(file_id);
  var parent_folder = file.getParents().next();
  target_folder.addFile(file);
  parent_folder.removeFile(file);
}

function formatDate(){
  var date = new Date();
  var formated = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd/HH:mm:ss:sss');
  return formated;
}



index.html
<!DOCTYPE html>
<html>
  <body>
    Copy file to target folder<br>
    <input type="text" id="file_url"> FILE URL<br>
    <input type="text" id="folder_url"> FOLDER URL<br>
    <button id="bt">Copy</button><br>
    <a id="folder_link" target="_blank"></a>
    
    <script>
    elem('bt').onclick = btClicked;
    
    function elem(id) {
      return document.getElementById(id);
    }
    
    function btClicked() {
      elem('folder_link').textContent = '';
      var file_url = elem('file_url').value;
      var folder_url = elem('folder_url').value;
      
      var file_id = file_url.split('/d/')[1].split('/')[0];
      var folder_id = folder_url.split('/folders/')[1];
      
      google.script.run
      .withFailureHandler(onFailure)
      .withSuccessHandler(onSuccess)
      .withUserObject(folder_url)
      .copyFileToFolder(file_id, folder_id);
    }
    
    function onSuccess(copy_file_url) {
      elem('folder_link').href = copy_file_url;
      elem('folder_link').textContent = copy_file_url;
    }

    function onFailure(e) {
      alert([e.message, e.stack]);
    }
    </script>
  </body>
</html>