home about terms twitter

【Python】GASとPythonをWebAPIで連携させてスプレッドシートにPOST

date: 2021-08-25 | mod: 2021-08-25

append_gif

前書き

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スプレッドシートへのデータ入力方法には以下の方法もあります。

方法

以下の手順で作成します。

  • データを入力するためのスプレッドシートを新規作成する。
  • スプレッドシートを介して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]が返却された場合は、接続に成功しています。

結果

append_gif

Google Colaboratory内でセルを実行するたびに、新しい列が挿入されることがわかります。

これにより、PythonからGASへのデータの入力が行えるようになりました。

この連携によって、ローカルなPython実行環境や外部のPython実行環境からGoogle スプレッドシートへのデータ入力が行えます。

関連記事

Pythonを用いたWebAPIとの接続例

GASを用いた簡単なウェブアプリの例(RSSリーダー)

Pythonを用いたGoogleスプレッドシートへのデータ入力例