1

キー「ABCKEY」を含むGoogleスプレッドシートがあり、Google Apps Scriptダッシュボードでデータを使用する前に、データに対してQUERY(SQL)関数を実行したいと考えています。

var ss = SpreadsheetApp.openById('ABCKEY');
var mydata = ss.getDataRange();

この記事では、スプレッドシートのデータに対してQUERY機能を使用して、グループ化されたデータを生成する方法について説明します。

次のクエリは、GoogleAppsScriptダッシュボードのデータソースとして使用したい正しいグループ化されたデータを生成します。

https://spreadsheets.google.com/a/mybusinessappdomain.com/tq?key=ABCKEY&tq=select%20A%2CC%2Csum(F)%2Csum(G)%20group%20by%20A%2C%20C

したがって、基本的にmydataは、JSON出力文字列を生成する上記のSQLクエリの結果を上記の変数に入力したいと思います。

これはどのように達成できますか?

4

2 に答える 2

2

私が提案するアプローチはこれです:

  1. UrlFetchApp.fetch()クエリuriの結果をスクリプトの変数に取得するために使用します。クエリURIはjavascriptを返し、Google視覚化サービスの結果を設定します。
  2. 結果の無関係なコンテンツを削除し、クエリ結果のJSON表現のみを残します。単純な正規表現抽出でこれを行うことができ、抽出された文字列をJSONオブジェクトに解析できます。
  3. 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()

于 2013-02-21T03:44:50.717 に答える
0

var objectContent = Utilities.jsonParse(jsonContent)jsonパーサーは、次の例のように、セル値の1つとして日付を持つ視覚化クエリ応答では機能しないと思います。

{
    "v": newDate(2013,
    11,
    31),
    "f": "31-Dec-2013",
    "p": {
        "style": "color: rgb(0, 0, 0);font-family:Dialog;"
    }
}
于 2014-01-22T07:07:56.517 に答える