Pythonで圧倒!GASと連携したスクレイピング徹底ガイド


GASとPythonの基本的な連携方法
PythonでGASを呼び出す準備
まず、PythonでGASを呼び出すためには、GAS側でWeb APIを作成する必要がある。
// GASスクリプトでAPIを作成
function doGet(e) {
var output = ContentService.createTextOutput();
output.setMimeType(ContentService.MimeType.JSON);
output.setContent(JSON.stringify({message: "Hello from GAS"}));
return output;
}
このスクリプトでは、GASで簡単なAPIを作っている。doGet関数がリクエストに応じてJSON形式の応答を返す。
PythonでGAS APIを呼び出す
次に、PythonからこのAPIを呼び出してみよう。
import requests
url = "https://script.google.com/macros/s/YOUR_SCRIPT_ID/exec"
response = requests.get(url)
data = response.json()
print(data['message'])
このPythonスクリプトでは、requests.getを使ってGASのAPIにアクセスし、JSON形式で取得したデータを表示している。

GASとPython、どちらを選ぶべきか
それぞれの特徴を理解する
– GAS : Googleの他のサービスとの連携が強み。GoogleスプレッドシートやGmailと組み合わせて使うのに適している。
– Python : 豊富なライブラリと高度なデータ処理能力が強み。スクレイピングなどデータ取得や解析に強い。
両者を組み合わせるメリット
両者の強みを組み合わせることで、多機能かつ効率的なツールを作成できる。
例えば、Pythonでスクレイピングを行い、データをGASで処理することで、Googleスプレッドシートに直接反映させることが可能だ。

GASとPythonの定期実行
GASで定期実行する方法
GASには定期実行機能が備わっているよ。これを使えば、スクリプトを定期的に実行できる。
function createTimeDrivenTriggers() {
ScriptApp.newTrigger('myFunction')
.timeBased()
.everyMinutes(5)
.create();
}
このスクリプトでは、ScriptApp.newTriggerで時間をベースにしたトリガーを作り、5分ごとにmyFunctionを実行する設定をしている。
Pythonで同様の処理を行うには?
Pythonでスクリプトを定期実行する場合、cronやscheduleパッケージを使うことで実行できるようになる。
import schedule
import time
def job():
print("Running task...")
schedule.every(5).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1)
このペースでは、schedule.every(5).minutes.do(job)で5分おきにjobを実行するようにスケジュールを設定している。

練習問題
ネクストステップとして、次の問題に挑戦してみよう。
1. Pythonでお好きなWebページからタイトルをスクレイピングし、GASを通じてGoogleスプレッドシートに保存するプログラムを作成せよ。
2. GASでのAPIを用いてPythonからデータを送信し、GASで受信したデータをログに出力せよ。
解答と解説
問題1の解答例
# Pythonでのスクレイピング
import requests
from bs4 import BeautifulSoup
url = "https://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.title.string
# 取得したタイトルをGAS経由でスプレッドシートに保存
requests.post("https://script.google.com/macros/s/YOUR_SCRIPT_ID/exec", data={'title': title})
このスクリプトでは、PythonのBeautifulSoupを用いてWebページのタイトルを取得し、それをGASのAPIにPOSTしている。
問題2の解答例
// GAS側でデータをログに出力
function doPost(e) {
if (e.parameter.title) {
Logger.log("Received title: " + e.parameter.title);
}
}
GASでは、doPost関数を用いて受信したデータをログに出力している。

