LANG SELRCT

Apps Script Reference  (Create: Create new Spreadsheet | Create new Apps Script

Thursday, March 8, 2018

Google Driveに複数ファイルをアップロードしたい(submitボタン使わない)


Google Driveに複数ファイルをアップロードしたい のsubmitボタンを使わないパターンです

ファイルを選択したらGoogleドライブの指定したフォルダにアップロードされます



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

var FOLDER_ID = "ID";
function upload_file_gs(reader_result, file_name) {
  var result_split = reader_result.split(',');
  var content_type = result_split[0].split(';')[0].replace('data:', '');
  var row_data = result_split[1];
  var data = Utilities.base64Decode(row_data);
  
  var file = Utilities.newBlob(data, content_type, file_name);
  var folder = DriveApp.getFolderById(FOLDER_ID);
  var drive_file = folder.createFile(file);
  var file_url = drive_file.getUrl();
  return file_url;
}
意訳
この処理は以下を実行する
指定したHTMLファイルを表示する


アップロード先のドライブのフォルダID
この機能がやること
受け取ったreader_resultをカンマ(,)で区切って 
content_typeを抜き出して
row_dataを抜き出して
row_dataをbase64Decodeして

Utilities.newBlobにファイルのデータとcontent_typeとファイル名を渡して
Google DriveのフォルダIDを指定して
そこにファイルを作成して
作成したファイルのURLを取得して
返す




index.html
<!DOCTYPE html>
<html>
<body>
  <form>
    <div>
      <input type="file" id="my_files" multiple>
    </div>
  </form>
  <textarea id="upload_file_ta" class="display_none"></textarea>
  <label id="upload_label"></label>
  <div id="upload_div"></div>
  <script>
    document.getElementById("my_files").addEventListener("change", upload_files);
    var files_len = 0;
    var uploaded_len = 0;

    function upload_files() {
      var files = document.getElementById("my_files").files;
      files_len = files.length;
      for (var i = 0; i < files.length; i++) {
        uploadFile(files[i]);
        document.getElementById("upload_label").textContent = "アップロードしています...";
      }
    }

    function uploadFile(file) {
      var reader = new FileReader();
      reader.onload = function() {
        var reader_result = reader.result;
        var file_name = file.name
        google.script.run
          .withSuccessHandler(uploaded)
          .upload_file_gs(reader_result, file_name);
      }
      reader.readAsDataURL(file);
    }

    function uploaded(file_url) {
      create_link(file_url);
      uploaded_len++;
      if (uploaded_len == files_len) {
        document.getElementById("upload_label").textContent = "アップロードしました";
      }
    }

    function create_link(file_url) {
      var div = document.getElementById("upload_div");
      var br = document.createElement("br");
      var link = document.createElement("a");
      link.textContent = file_url;
      link.setAttribute("href", file_url);
      link.setAttribute("target", "_blank");
      div.appendChild(link);
      div.appendChild(br);
    }
  </script>
</body>
</html>
意訳
 


フォームを置く

ファイルを選択するボタンを置く


テキストエリアを置く
アップロード状況を示すテキストを入れるラベルを置く
アップロードしたファイルのURLを入れるdivを用意しておく

idがmy_filesの要素が変更されたらupload_filesを実行する
アップロードするファイル数の初期値を0にしておく
アップロードされたファイル数の初期値を0にしておく

この機能がやること
idがmy_filesの要素のファイルをすべて取得する
アップロードするファイル数をfiles_lenに入れる
ファイルの数だけ以下を繰り返す
uploadFileにファイルを一つずつ渡す
idがupload_labelの要素のテキストをuploading...にする



この機能がやること
FileReaderを作って
読み込みが成功したら以下を実行する
resultを取得して
fileから名前を取得して
.gsファイルの指定したスクリプトを実行する
成功したらuploadedを実行する
実行する.gsファイルはコード.gsにあるupload_file_gsでreader_result, file_nameを渡す

fileを読み込む


この機能がやること
受け取ったfile_urlをcreate_linkに渡す
アップロードしたファイル数を1ずつ足していく
もしアップロードしたファイル数とアップロードするファイル数が一致したら
idがupload_labelの要素のテキストをuploadedにする



この機能がやること
idがupload_divの要素を取得する
改行を作る
ハイパーリンクを作る
リンクのテキストに受け取ったfile_urlを入れる
リンク先にfile_urlを設定する
リンクを新規タブで開くように設定する
upload_divにリンクを追加する
upload_divに改行を追加する






Latest post

スプレッドシートA列にある複数のテキストをスライドに追加したい(Google Apps Script)

今回Google Apps Scriptでやりたいこと GoogleスプレッドシートA列にある複数の値を取得して Googleスライドに渡して 図形オブジェクトのテキストとして追加したい ① スプレッドシートのA列に値を入れておく ② Code.gsのinsertNewShape...