Googleドライブにtext/plainで保存されたコードを読み込んで動かしたい。
こういうテキストファイルがあって、JavaScriptの中でオブジェクトにして使いたい。
eval()の引数に渡せばできますが、参考サイトに「必要以上に eval を使用しないで!」と書かれているのでeval()を使わない方法で試してみます。
以下のコード2.gsで new Function() を使って引数に文字列を入れる方法でやってみました。
その前にテスト用のデータを用意しておくコードもコード1.gsで書いておきました。
フォルダIDを設定して create_file() を実行すると
作成されたファイルのURLがログに出る
コード1.gs
var FOLDER_ID = "フォルダID"; function create_file() { var data = '[{id: 123, message: "hello"}]' var content_type = "text/plain"; var file_name = "test"; var blob = Utilities.newBlob("", content_type, file_name); var file = blob.setDataFromString(data, "UTF-8"); var folder = DriveApp.getFolderById(FOLDER_ID); var result = folder.createFile(file); Logger.log(result.getUrl()) } |
コード1.gsのcreate_file()実行後のログに出たURLからIDを取得して
コード2.gsのファイルIDに設定し
myFunction() を実行する
コード2.gsvar FILE_ID = "ファイルID"; function myFunction() { var data = getData(); var obj = altEval(data); var message = obj()["events"][0]["message"]; Logger.log(message) } function getData() { var file = DriveApp.getFileById(FILE_ID); var blob = file.getBlob() var data = blob.getDataAsString(); return data; } function altEval(data) { var obj = '{ events: ' + data + '}'; var str = 'return ' + obj; var func = new Function(str); return func; } |
実行結果
補足
ちなみに非推奨のeval()でやると
コード3.gsvar FILE_ID = "ファイルID"; function myFunction() { var data = getData(); var obj = eval(data); var message = obj[0]["message"]; Logger.log(message); } function getData() { var file = DriveApp.getFileById(FILE_ID); var blob = file.getBlob() var data = blob.getDataAsString(); return data; } |
eval()を使う癖がつくと良くないので使わない方がよさそう。