web-dev-qa-db-ja.com

JSONとして(新しいスタイルのパブリック)Googleシートにアクセスする

JSONの(新しいスタイルの)Googleシートのコンテンツにアクセスするにはどうすればよいですか?私の目的はJavaScriptから値にアクセスすることなので、HTTP経由でJSONをダウンロードできるようにする必要があります。

例: このシート からJSONとしてデータをダウンロードするにはどうすればよいですか?

私はウェブ検索で答えを見つけようとしましたが、最終的に失敗しました:

27
jochen

私は最終的に(のような)私の問題を解決しました。将来の参考のために、そして他の誰かが同じトラブルに遭遇した場合に備えて、ここで私が思いついた解決策:

  1. ワークシートを一般公開するためには、ワークシートを一般公開する必要があります。これは、GoogleスプレッドシートのウェブインターフェースでメニューエントリFile > Publish to the web ... > link > publishを使用して行われます。スプレッドシート全体を公開することも、個々のワークシートを公開することもできます。

  2. プログラムでGoogleスプレッドシートのデータにアクセスするためのAPIは、 Google Sheets API web pages で説明されています。このAPIは、https://spreadsheets.google.com/feeds/.../key/worksheetId/...という形式のURLを使用します。少し奇妙なことに、keyおよびworksheetIdの意味はAPIドキュメントで説明されていないようです。

    私の実験では、Webインターフェイス経由でシートにアクセスするために使用されるURLの一部を取得することで、key値を見つけることができることを示しています( here も参照)。キーは、/d/の後から次のスラッシュまでのすべてです。したがって、質問のスプレッドシートのキーは1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvIです。 worksheetIdは、スプレッドシート内のワークシートの位置を示す整数のようです。質問の例では、表示されているシートが2番目のワークシートであることを知っている必要があります。この場合のworksheetId2です。

    APIはpublicおよびprivate要求を定義しました。認証なしでエクスポートされたリソースにアクセスするには、publicリクエストを使用する必要があります。

  3. スプレッドシートからデータを取得するためのAPI呼び出しについては、セクション "リストベースのフィードの取得" で説明しています(例の[プロトコル]タブをクリックします)。質問のスプレッドシートからデータを抽出するのに必要なURLは

    https://spreadsheets.google.com/feeds/list/1mhv1lpzufTruZhzrY-ms0ciDVKYiFJLWCMpi4OOuqvI/2/public/full

    このURLへのHTTP GET要求は、そのデータをXMLとして返します。 (データをJSONとして取得する方法を見つけていません。)

  4. クロスサイトリクエストに対する通常の保護は、WebアプリでJavaScript XML RPC呼び出しを介してデータにアクセスすることを困難にします。この問題を回避する1つの方法は、nginxの proxy_pass directive を使用して、Webサーバーを介してAPI呼び出しをプロキシすることです(e.g。)。

上記の手順は、問題の問題に対する少なくとも部分的な解決策です。唯一の難点は、データがJSONではなくXMLとして返されることです。 APIドキュメントにはJSONが記載されていないため、この形式でデータを抽出することはもうできないでしょうか?

22
jochen

最新のAPI(v4)を使用する場合は、次を実行する必要があります。

  1. スプレッドシートAPIキーを生成します(以下の手順を参照)。
  2. シートを一般公開します。
  3. 次の形式のリクエストを使用します。

    https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/values/RANGE?key=API_KEY
    

その後、クリーンなJSON応答が返されます。

{
  "range": "Sheet1!A1:D5",
  "majorDimension": "ROWS",
  "values": [
    ["Item", "Cost", "Stocked", "Ship Date"],
    ["Wheel", "$20.50", "4", "3/1/2016"],
    ["Door", "$15", "2", "3/15/2016"],
    ["Engine", "$100", "1", "30/20/2016"],
    ["Totals", "$135.5", "7", "3/20/2016"]
  ],
}

ページのコンテンツ全体を指定する場合、Sheet1などの識別子は 完全に有効 であることに注意してください。

詳細については、 Basic Reading を参照してください。


V4 APIの時点で、 すべてのリクエストに付随する必要があります 識別子(APIキーなど)を伴う:

公開データのGoogle Sheets APIへのリクエストには、APIキーまたはアクセストークンなどの識別子を添付する必要があります。

リンクされたドキュメントの手順に従って、 資格情報ページ でAPIキーを作成します。

確認してください:

  1. Google Cloud Platformで新しいアプリを作成します。
  2. 新しいAPIキーを作成します。
  3. Google Sheets APIを追加します。 (APIマネージャー>ダッシュボード> APIを有効にする)

ユーザーにログインを強制せずに まだ公開データにアクセス できることに注意してください。

新しいSheets API v4では、可視性の明示的な宣言はありません。 API呼び出しは、スプレッドシートIDを使用して行われます。指定したスプレッドシートにアクセスする権限がアプリケーションにない場合、エラーが返されます。それ以外の場合、呼び出しは続行します。

シートをWebに公開する必要はないしないことに注意してください。あなたがする必要があるのは、リンクを持つ誰でもシートにアクセスできることを確認することだけです。

(つまり、Google Sheets APIで資格情報の作成をクリックすると、その他の非UI、ユーザーデータを選択し、「ユーザーデータにアクセスできません」と表示されますログインにユーザーの操作が必要なため、UIのない​​プラットフォームです。」このメッセージは無視しても問題ありません。これはパブリックデータであるため、APIキーだけが本当に必要です。)


一般的なエラーメッセージ:

要求に有効なAPIキーがありません。

呼び出しにkey=パラメータを含めていません。

APIキーが無効です。有効なAPIキーを渡してください。 Google Developers Console

間違ったAPIキーを指定しました。キーを正しく入力したことを確認してください。まだキーをお持ちでない場合は、 Google開発者コンソール にアクセスして作成してください。

APIキーが見つかりません。有効なAPIキーを渡してください。
GoogleデベロッパーコンソールAPIキー

APIキーはおそらく正しいでしょうが、ほとんどの場合、Googleスプレッドシートの権限を追加していません。 GoogleデベロッパーコンソールAPIキーページに移動し、シートの権限を追加します。

呼び出し元に許可がありません

シートは一般公開されていません。

39
Senseful

同じURLパラメータを使用してJSONを取得する方法は次のとおりです。

"https://spreadsheets.google.com/feeds/list/" + spreadsheetID + "/od6/public/values?alt=json";

XMLに至るまでのパスを使用して、@ jochenに答えてください"https://spreadsheets.google.com/feeds/list/" + spreadsheetID + "/od6/public/" + sheetID;

@jochenの答えが説明するように、このsheetIDはスプレッドシートのシートの順序に基づいています。

5
bomberjackets