私が提案するアプローチはこれです:
UrlFetchApp.fetch()
クエリuriの結果をスクリプトの変数に取得するために使用します。クエリURIはjavascriptを返し、Google視覚化サービスの結果を設定します。
- 結果の無関係なコンテンツを削除し、クエリ結果のJSON表現のみを残します。単純な正規表現抽出でこれを行うことができ、抽出された文字列をJSONオブジェクトに解析できます。
- JSONオブジェクトを2次元配列にデコードします
mydata
。これには、視覚化クエリでテーブルがJSONオブジェクトとしてどのように表されるかをある程度理解する必要があります。
JSONクエリの結果は次のように構成されています。
{
"version": "0.6",
"status": "ok",
"sig": "862651648",
"table": {
"cols": [
{
"id": "A",
"label": "",
"type": "string",
"pattern": ""
},
{
"id": "D",
"label": "Population Density",
"type": "number",
"pattern": "#0.###############"
}
],
"rows": [
{
"c": [
{
"v": "Indonesia"
},
{
"v": 117,
"f": "117"
}
]
},
{
"c": [
{
"v": "China"
},
{
"v": 137,
"f": "137"
}
]
},
{
"c": [
{
"v": "Nigeria"
},
{
"v": 142,
"f": "142"
}
]
},
{
"c": [
{
"v": "Pakistan"
},
{
"v": 198,
"f": "198"
}
]
},
{
"c": [
{
"v": "India"
},
{
"v": 336,
"f": "336"
}
]
},
{
"c": [
{
"v": "Japan"
},
{
"v": 339,
"f": "339"
}
]
},
{
"c": [
{
"v": "Bangladesh"
},
{
"v": 1045,
"f": "1045"
}
]
}
]
}
}
オブジェクトは、テーブルの列を説明するオブジェクトtable
の配列で構成されていることに気付くでしょう。cols
配列の場合、関心のある部分label
は列のです。
その後、table
オブジェクトにはオブジェクトの配列が含まれrows
、各c
オブジェクトには、行の各列のデータを含むオブジェクトの配列が含まれます。配列の場合、v
関心のあるor値です。(f
同じデータのフォーマットされたバージョンが含まれています)
したがって、パーサーは最初に列ヘッダーを反復処理し、次にテーブルの各行を反復処理して、push
関心のある値を2次元配列に変換しmydata
ます。
この例では、クエリ言語リファレンスで提供されているインタラクティブコードサンプルで使用されている公開スプレッドシートにアクセスしており、サンプルクエリも使用しています。独自のクエリで独自のスプレッドシートにアクセスするように簡単に変更できるように、例を作成しました。コードは次のとおりです。
// Specify the spreadsheet key and the query to be retrieved
var ssKey = 'pCQbetd-CptGXxxQIG7VFIQ';
var query = encodeURIComponent('SELECT A,D WHERE D > 100 ORDER BY D');
// Build url to peform query
var url = 'http://spreadsheets.google.com/tq?key=%KEY%&tq=%QUERY%'
.replace('%KEY%',ssKey)
.replace('%QUERY%',query);
// Use UrlFetchApp to get the results of the query as a string.
var response = UrlFetchApp.fetch(url);
var content = response.getContentText();
//Logger.log(content);
// Extract the JSON object from the response. Note that the response contains
// multiple lines of Javascript, and that it's the second line that has our
// data table in it.
var regex = /.*google.visualization.Query.setResponse\((.*)\)/g
var jsonContent = regex.exec(content)[1];
Logger.log(jsonContent);
var objectContent = Utilities.jsonParse(jsonContent);
var numCols = objectContent.table.cols.length;
var numRows = objectContent.table.rows.length;
// Decode objectContent into a two-dimensional array.
var mydata = []
// Start with the header row.
mydata[0] = [];
for (var col = 0; col < numCols; col++ ) {
mydata[0].push(objectContent.table.cols[col].label);
}
// Then data rows
for (var row = 0; row < numRows; row++) {
mydata[row+1] = [];
for (var col = 0; col < numCols; col++ ) {
mydata[row+1].push(objectContent.table.rows[row].c[col].v);
}
}
// Done - mydata is now a two-dimensional array with the results of the query
debugger; // If debugging, pause to examine results
table
ダッシュボードでデータを使用する予定がある場合は、の呼び出し後にオブジェクトを使用することをお勧めしますjsonParse()
。