前準備
何をおいてもGoogle Cloud Platformでプロジェクトを作成しておく。 (参考) このプロジェクト内で必要なAPIを有効にして、利用するための設定を色々と行っていく。
Google Calendarにアクセス
このサイトやその他に書かれている通りにやろうと思ったが、なんだかPython Quickstartのページの見た目が違う。 ということで少し遠回りしたが、大まかにやったことは、
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
さらに先ほど作成したプロジェクト内で
- Google Calendar APIを有効にする。
- Create credentialsのページを参考にOAuth client ID credentialの作成。
- 作成途中のユーザータイプを選ぶ箇所(ステップ6)では、「内部」が選べなかったので「外部」を選択。同時に、テストユーザーとして自分のgmailアカウントを登録しておくことで、アプリがアカウントにアクセス出来るようになる。
- 作成途中のスコープを選ぶ箇所(ステップ11)では、Google Calendar API関連のものを全て(必要な分だけ)選択。
- 作成した認証情報を
credential.json
の名前で保存したら、ここにある通りquickstart.py
の実行。初回実行時にアプリを認証すれば、token.json
が作成されて二度目以降は認証がいらなくなる。
カレンダーに書き込むプログラム
上記サイトからの借り物。
from __future__ import print_function
import datetime
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/calendar']
def main():
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('calendar', 'v3', credentials=creds)
event = {
'summary': '予定1',
'location': 'Shibuya Office',
'description': 'サンプルの予定',
'start': {
'dateTime': '2019-09-10T09:00:00',
'timeZone': 'Japan',
},
'end': {
'dateTime': '2019-09-10T17:00:00',
'timeZone': 'Japan',
},
}
event = service.events().insert(calendarId='コピーしたIDを貼り付け',
body=event).execute()
print (event['id'])
if __name__ == '__main__':
main()
SCOPES
を読み込みのみから書き込みありに変更しているので、token.json
を一度削除して作り直すのを忘れない。
スプレッドシートの利用
このサイトの記述通りにやればできる。 大まかな流れとしては、先ほど作成したプロジェクト内で
- Google Drive APIとGoogle Sheets APIを有効にする。
- 認証情報を作成し(サービスアカウントキーというものを選択する)、JSONタイプのキーをダウンロードする。
- JSONファイルの中をのぞいて、
client_email
と書かれたアドレスをコピーする。 - スプレッドシートの共有メニューから、上記のアドレスにメールを送って編集者権限でシートを共有する。このときaddress not foundエラーのメールが届くが、どうやらそれでも上手くいっているよう。
シートを開くまで
またしても上記サイトからの借り物。
import gspread
import json
#ServiceAccountCredentials:Googleの各サービスへアクセスできるservice変数を生成します。
from oauth2client.service_account import ServiceAccountCredentials
#2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
#認証情報設定
#ダウンロードしたjsonファイル名をクレデンシャル変数に設定(秘密鍵、Pythonファイルから読み込みしやすい位置に置く)
credentials = ServiceAccountCredentials.from_json_keyfile_name('ダウンロードしたJSONファイル名.json', scope)
#OAuth2の資格情報を使用してGoogle APIにログインします。
gc = gspread.authorize(credentials)
#共有設定したスプレッドシートキーを変数[SPREADSHEET_KEY]に格納する。
SPREADSHEET_KEY = 'スプレッドシートキー'
#共有設定したスプレッドシートのシート1を開く
worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1
JSONファイルのパスと、スプレッドシートキー(~docs.google.com/spreadsheets/d/[Spreadsheet_Key]/edit#gid=xxx)を上のコードに埋める。
値の読み取り
重要なgspreadモジュールのドキュメントはこちら。 基本の基本は
- n行目の値をarrayで返す
worksheet.row_values(n)
- n列目の値をarrayで返す
worksheet.col_values(n)