【Python】GASとPythonをWebAPIで連携させてスプレッドシートにPOST
前書き
Google Apps Script(グーグル アップス スクリプト:GAS)はGoogleが提供しているスクリプト言語です(公式サイト)。JavaScriptをベースとした言語であり、JavaScriptが標準として備えている機能や関数を使うことができ、それによりウェブアプリを開発することができます。
Pythonはオープンソースのプログラミング言語であり、バックエンドとしてウェブサービスの構築を行うためや、ウェブサイトへの機械的な接続のためなど、幅広い用途に用いられています。
いずれも大変便利なプログラミング言語であるため、ぜひ連携したいところです。しかしながら、GAS上ではPythonを直接コードすることはできません。GAS上にHTMLファイルを配置することはできますが、Pythonファイルを配置してもそれを実行することはできません。
その代わりに、GASはWebAPIとしても機能させることができます。そのため、WebAPIを通してPythonからGASに、またGASからPythonへの情報のやり取りは行うことができます。
今回はGASにより構築したWebAPIにPythonで接続し、GASを通してPythonで処理したデータをスプレッドシートに記録するためのシンプルな方法について記載します。
備考
今回の方法ではGoogle ColaboratoryをPythonの実行環境に選択していますが、Colaboratory上ならばGoogle Drive内のファイルについて操作が可能です。そのため、スプレッドシートについてPythonで処理することはGASを介さなくても可能であることを補足いたします。
今回のチュートリアルの場合、実際のPython実行環境はGoogleのサービスからは独立したものを想定します。
Pythonを用いたWebAPIとの接続例はこちらをご参照下さい。
GASを用いた簡単なウェブアプリの例(RSSリーダー)は以下をご参照ください。
Pythonを用いてGoogleスプレッドシートへのデータ入力方法には以下の方法もあります。
- パソコン版Google Driveを通してファイルを操作する([(BAT)パソコン版Googleドライブの共有フォルダ上でJupyterLabを起動])。
- Google Colaboratory上でGoogle Drive中のファイルを操作する(CSVファイルの例:[(Python)Arxivの論文情報からWordCloudを作成する])。
方法
以下の手順で作成します。
- データを入力するためのスプレッドシートを新規作成する。
- スプレッドシートを介してGASのコードを準備する。
- Google ColaboratoryでPythonのコードを準備する。
- Google Colaboratory上でコードを実行する。
開発環境
Google Apps Script (GAS)
GASを用いた簡単なウェブアプリの例(RSSリーダー)によるGASのチュートリアルは[【GAS】トリガーで定期実行するシンプルなRSSリーダーを作成]をご参照ください。
以降の操作に伴うGoogleの各種認証は全て了承してください。
- 任意のフォルダにスプレッドシートを新規作成します。
- 新規作成したファイルを開き、「ツール」から「スクリプトエディタ」を選択します。
- 新しいタブでApps Scriptが開かれるため、
コード.gs
へ以下のコードを入力します。シートのIDはスプレッドシートを開いた時のURLhttps://docs.google.com/spreadsheets/d/■■■/
の■■■
部分を参照してください。
function doPost(e) {
// POSTされたデータをJSONとしてパース
var inputData = JSON.parse(e.postData.getDataAsString());
// スプレッドシートをIDから取得
var spreadsheet = SpreadsheetApp.openById('シートのIDをここに入力');
// シート名からシートを取得
var sheet = spreadsheet.getSheetByName('シート1');
// シートに列を追加
sheet.appendRow([inputData.token, inputData.mail, inputData.pass]);
}
doPost()
関数内では、外部からアプリケーションにPOSTとして与えられたパラメータを処理します。
この関数内でPOSTされたデータを処理し、スプレッドシートに新しい列として挿入します。
スプレッドシートに関するAPIは、Spreadsheet ServiceのAPI(公式サイト)を参考にします。
関数 | 役割 |
---|---|
appendRow(データ) | 行の追加 |
openById(シートid) | idからスプレッドシートの取得 |
getSheetByName(シート名) | シート名からシートの取得 |
- 「サービス」の+をクリックし、「Google Sheets API」を追加します。
- 「デプロイ」の「新しいデプロイ」から「ウェブアプリ」を選択し、「アクセスできるユーザー」を「全員」にします。この設定により、URLを知っている者ならばスプレッドシートにデータを追加できるようになります。安全のために一時的な設定とするか、外部にURLを知らせないようにしてください。
- デプロイしたURLを取得して、Google Colaboratoryのコード中に記入します(後述)。
以上の設定で、GASをWebAPIとしてPOSTを受け取るようにすることができました。
Google Colaboratory (Colab)
Google Colaboratoryは、GASと同様にGoogleが提供するブラウザ上でPythonを実行するためのサービスです。
ローカル環境における同様のPython実行環境としてJupyter Notebook(Jupyter Lab)がありますが、それをGoogle社が提供する環境下で、ウェブブラウザ上で行うことができます。
機械学習やそれに伴うデータ処理が主な用途ですが、Pythonによる基本的な開発を十分に行うことができます。
今回はこのGoogle ColaboratoryをPythonの実行環境として選択します。
GASによるWebAPIへの接続用ライブラリとして、Requests(公式ドキュメント)を用います。
ライブラリの名前の通り、HTTPリクエストを送信する際に利用できます。 コードの可読性が高いことが特徴です。
- ドライブの「新規」から「その他」、「Google Colaboratory」を選択します。
- Google Colaboratory上で新規のファイルが開きますので、セルに以下のコードを入力します。
url
には先ほど取得したウェブアプリのURLを入力してください。
import json
import requests
import time
url = "ここにGASでデプロイしたURLを入力"
# JSON形式でデータを用意してdataに格納
data = {
"token": "token",
"mail" : "mail-address",
"pass" : "password"
}
# json.dumpでデータをJSON形式として扱う
r = requests.post(url, data=json.dumps(data))
print(r)
コマンド
Google Colaboratory内で上記のコードを入力したセルを実行します。
Response [401]
が返却された場合は、ウェブアプリの接続の権限が「自分のみ」
になっている等のアクセス権限上の問題があります。デプロイ時の設定を見なおしてください。
Response [200]
が返却された場合は、接続に成功しています。
結果
Google Colaboratory内でセルを実行するたびに、新しい列が挿入されることがわかります。
これにより、PythonからGASへのデータの入力が行えるようになりました。
この連携によって、ローカルなPython実行環境や外部のPython実行環境からGoogle スプレッドシートへのデータ入力が行えます。
関連記事
Pythonを用いたWebAPIとの接続例
GASを用いた簡単なウェブアプリの例(RSSリーダー)
Pythonを用いたGoogleスプレッドシートへのデータ入力例
- パソコン版Google Driveを通してファイルを操作する([(BAT)パソコン版Googleドライブの共有フォルダ上でJupyterLabを起動])。
- Google Colaboratory上でGoogle Drive中のファイルを操作する(CSVファイルの例:[(Python)Arxivの論文情報からWordCloudを作成する])。