0

初心者の Javascript プログラマーです。Javascript で作成されたカスタム関数を使用して、YQL クエリから Google ドライブ スプレッドシートに JSON 形式のデータを入れようとしています。私は、Web ページにデータを入力しているのではなく、スプレッドシートにデータを移動しているだけです。

JSON 応答は次のとおりです (スプレッドシートのセルに直接書き込むテスト関数からコピーしたもの)。

{"query":{"count":1,"created":"2013-08-29T20:56:58Z","lang":"en-US","re​​sults":{"optionsChain":{"有効期限":"2013-12-21","シンボル":"HYS","オプション":[{"シンボル":"HYS131221C00103000","タイプ":"C","行使価格":"103","最終価格":"3.00","change":"0","changeDir":null,"bid":"NaN","ask":"5","vol":"2","openInt":"2 "},{"symbol":"HYS131221C00105000","type":"C","strikePrice":"105","lastPrice":"0.40","change":"0","changeDir":null, "入札":"NaN","ask":"5","vol":"10","openInt":"11"},{"symbol":"HYS131221C00106000","type":"C","strikePrice" :"106","lastPrice":"0.05","change":"0","changeDir":null,"bid":"NaN","ask":"5","vol":"1" ,"openInt":"120"},{"symbol":"HYS131221C00107000","type":"C","strikePrice":"107","lastPrice":"0.10","change":"0" ,"changeDir":null,"bid":"NaN","ask":"0.2","vol":"40","openInt":"80"},{"symbol":"HYS131221P00100000","type":"P","strikePrice":"100","lastPrice":"0.70","change":"0","changeDir":null,"bid":"NaN"," ask":"5","vol":"1","openInt":"1"},{"symbol":"HYS131221P00102000","type":"P","strikePrice":"102"," lastPrice":"1.00","change":"0","changeDir":null,"bid":"NaN","ask":"5","vol":"15","openInt":" 15"},{"シンボル":"HYS131221P00103000","タイプ":"P","行使価格":"103","最終価格":"1.55","変更":"0","changeDir":null,"bid":"NaN","ask":"5","vol":"40","openInt":"50"},{"symbol":"HYS131221P00105000" ,"type":"P","strikePrice":"105","lastPrice":"2.35","change":"0","changeDir":null,"bid":"0.3","ask" :"5.2","vol":"15","openInt":"15"},{"symbol":"HYS131221P00107000","type":"P","strikePrice":"107","lastPrice" :"6.50","change":"0","changeDir":null,"bid":"2.05","ask":"7","vol":"2","openInt":"20"}]}}}}

ここで、上記の JSON 形式のオブジェクトを単純に変数に割り当てる (つまり、ハード コードする) と、名前と値のペアを確認したり、データを抽出したり、反復を実行したりできます。しかし、応答を変数に直接割り当てると、 (つまり、オンザフライで受信)何かを確認したり、繰り返したりすることができません。たとえば、変数「o」を受け取ってスプレッドシートのセルに書き込むことはできますが、最初の子である o["query"] は表示できません。クエリを開始する関数は、それを使用する関数内にあるため、タイミングの問題ではないと思います。

4

1 に答える 1

0

さて、私は完全に理解していない解決策で自分の質問に答えています。動作するコードは次のとおりです(説明とさらに質問があります):

function YQLquery() { // A YQL query returning JSONP with XJSON2CSV function embedded in the response
  var fetchstring1 = "http://query.yahooapis.com/v1/public/yql?"; // constructing YQL query in 4 parts
  var fetchstring2 = "q=SELECT%20*%20FROM%20yahoo.finance.options";
  var fetchstring3 = "%20WHERE%20symbol%3D'HYS'%20AND%20expiration%3D'2013-12'";
  var fetchstring4 = "&format=json&callback=XJSON2CSV&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
  var fetchstring = fetchstring1 + fetchstring2 + fetchstring3 + fetchstring4;  
  return UrlFetchApp.fetch(fetchstring); 
  /* This returns (truncated after first option array item, but you get the point):
  XJSON2CSV({"query":{"count":1,"created":"2013-09-13T21:39:35Z","lang":"en-US",
  "results":{"optionsChain":{"expiration":"2013-12-21","symbol":"HYS","option":
  [{"symbol":"HYS131221C00103000","type":"C","strikePrice":"103","lastPrice":
  "3.00","change":"0","changeDir":null,"bid":"1.65","ask":"2","vol":"NaN","openInt":"2"},{ etc etc*/
}//end of function YQLquery

function XJSON2CSV(YQLQueryResponse) { //converts the YQLquery JSONP response payload (i.e. JSON portion) to CSV string
    var vx = YQLQueryResponse;
    var JSONobj = vx["query"]["results"]["optionsChain"]["option"]; // obtain the option array within JSON
    var CSVLine = [];
    var i = 0;
    var j = "";
    for (var i in JSONobj) {
        CSVLine[i] = []; // gets the JSON array objects
        for (var j in JSONobj[i]){
            CSVLine[i].push(JSONobj[i][j]); // get the name/value pairs from each array object
        }; //end of inner loop
    }; //end of outer loop
   return CSVLine; 
} //end of function XJSON2CSV()

function xxx() //test it
{
  return eval(YQLquery().toString());
}

コメント:

1)元の質問で想定したことに反して、タイミングが問題でした。そこで、コールバック関数 (この場合は XJSON2CSV) を使用することにしました。JSONP 応答で YQL がその呼び出しを返すようにする (引数として完全な JSON 文字列ペイロードを使用)。

2) ある程度はうまく機能しました - 返された XJSON2CSV 呼び出しはオブジェクトであり、関数が必要でした。かなりの実験の後、それを文字列に変換し、(反対のすべてのアドバイスに対して) "eval()-" することで解決策を得ました。

質問: "eval()" を含まない最後のステップ (関数 "xxx" 内) を行うためのより良い方法はありますか? または、別の言い方をすれば、関数 xxx を「return QYLquery;」にすることができないのはなぜですか。

今まで応答しなかったことを Andy に謝罪します。

于 2013-09-14T14:40:26.657 に答える