Googleドライブのフォルダ内に複数の画像を保存してHtml Serviceに読み込みたい
今回考えた手順
- Googleドライブのフォルダを指定する
- フォルダ内のファイルを取得する
- 取得したファイル名とIDを配列に入れて昇順に並び替える
- それを不可視のtextareaに入れる
- ファイルIDから表示用のURLを作ってimgのsrcに入れる
- next, prevボタンで前後の画像を表示する
- jumpボタンで指定した番号の画像を表示する
コード.gs
//フォルダを指定する var FOLDER_ID = "フォルダID"; /************************************ doGet ************************************/ function doGet(e) { return HtmlService.createHtmlOutputFromFile("index"); } /************************************ getFiles フォルダ内のファイルを取得して 昇順にして返す ************************************/ function getFiles() { var array = []; var folder = DriveApp.getFolderById(FOLDER_ID); var contents = folder.getFiles(); while(contents.hasNext()) { var file = contents.next(); var name = file.getName(); var id = file.getId(); var obj = {}; obj["name"] = name; obj["id"] = id; array.push(obj); } var sorted = objSort(array); return array; } /************************************ objSort 並べ替える ************************************/ function objSort(array) { var ascending = array.sort(asc); return ascending; } /************************************ asc nameで昇順に並べ替える ************************************/ function asc(a, b){ var targetA = a.name; var targetB = b.name; if(targetA > targetB){ return 1; }else if(targetA < targetB ){ return -1; }else{ return 0; } } |
index.html
<!DOCTYPE html> <html> <head> <style> #image { height: 100vh; } .display_none { display: none; } </style> </head> <body> <textarea id="ta" class="display_none"></textarea> <input id="num_tb" type="text"> <button id="jump_bt">jump</button> <button id="prev_bt">prev</button> <button id="next_bt">next</button> <br> <img id="image" src=""> <script> /************************************ グローバル ************************************/ var jump_bt = elem("jump_bt"); var next_bt = elem("next_bt"); var prev_bt = elem("prev_bt"); var num_tb = elem("num_tb"); var image = elem("image"); var ta = elem("ta"); /************************************ イベント ************************************/ jump_bt.onclick = jumpClicked; next_bt.onclick = nextClicked; prev_bt.onclick = prevClicked; /************************************ elem(id) ************************************/ function elem(id) { return document.getElementById(id); } /************************************ 起動時に実行 ************************************/ getFilesNameId(); /************************************ get_data() ************************************/ function getFilesNameId() { google.script.run .withFailureHandler(onFailure) .withSuccessHandler(onSuccess) .getFiles(); } /************************************ onSuccess(result) ************************************/ function onSuccess(array) { ta.value = JSON.stringify(array);//一度JSON形式にする showImage(0); } /************************************ showImage ファイルのURLをimageのsrcに入れて テキストボックスにページの数値を入れる ************************************/ function showImage(num) { var array = JSON.parse(ta.value);//JSON文字列をオブジェクトに変換する var view_path = "https://drive.google.com/thumbnail?sz=w1000&id="; image.src = view_path + array[num]["id"]; num_tb.value = num; } /************************************ onFailure(e) ************************************/ function onFailure(e) { alert([e.message, e.stack]); } /************************************ jumpClicked テキストボックスの数値をみてそのページを開く ************************************/ function jumpClicked() { var num = getNumTotal()["num"]; var total = getNumTotal()["total"]; if(num > total-1 || num < 0) { alert("有効範囲は、0〜" + (total-1).toString() + "ページ"); } else { showImage(num); } } /************************************ nextClicked ひとつ次の画像を開く ************************************/ function nextClicked() { var num = getNumTotal()["num"]; var total = getNumTotal()["total"]; num = num + 1; if(num > total-1) { num = total-1; } else { showImage(num); } } /************************************ prevClicked ひとつ前の画像を開く ************************************/ function prevClicked() { var num = getNumTotal()["num"]; num = num - 1; if(num < 0) { num = 0; } else { showImage(num); } } /************************************ getNumTotal テキストボックスの数値とファイルの総数をオブジェクトで返す ************************************/ function getNumTotal() { var num = parseInt(num_tb.value); var array = JSON.parse(ta.value) var total = array.length; var obj = {}; obj["num"] = num; obj["total"] = total; return obj; } </script> </body> </html> |