LANG SELRCT

コードを書く場所

2019年10月21日月曜日

JavaScriptでeval()を使わずに文字列をコードとして使いたい


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.gs
var 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.gs
var 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()を使う癖がつくと良くないので使わない方がよさそう。