PythonからGoogleスプレッドシートを操作するMac用アプリ

Python学習【365日チャレンジ!】357日目のマスターU(@Udemy11)です。

いちばんやさしいGit&GitHubの教本】を参考にGitとGitHubを学習し始めたとお話しましたが、題名とはちょっと程遠い感じがしています。

操作の方法を丁寧に解説してくれてはいるものの、GitやGitHubをコマンドラインで操作する内容になっているため、イメージがつかみづらく、いちばんやさしいかどうかはちょっと疑問符がつく内容です。

コマンドを使った基本的な使い方は丁寧に解説してくれているので、操作自体は本のとおり進めていけばある程度わかるようになるのですが「もう少しイメージ図があったほうがわかりやすいのにな〜」と勝手に思っています。

それでは、今日もPython学習を始めましょう。

昨日の復習

昨日は、GoogleスプレッドシートをPythonから操作するアプリを作りました。

これまでに作成したプログラムを元に、入力フォームとフォームから取得した値を使って処理をするコードを組み合わせたアプリが完成しました。

とはいえ、あまり役にたたないプログラムなので、あくまで入力フォームと処理実行プログラムを組み合わせてGoogleスプレッドシートを操作する方法を目に見えるか

昨日の学習内容については、こちらの記事をごらんください。

今日は、作成したアプリをpy2appを使ってMac用アプリにしてみたいと思います。

メインプログラム

メインのプログラムは昨日作成したinterface.pycontrol.pyの2つのファイルです。

中身は昨日の記事をごらんください。

control.pyの1ヶ所だけ変更する部分があります。

それが、秘密鍵のファイルを読み込むコードですが、作成したMac用アプリと同じ階層にjsonファイルを置いて読み込むようにするので、6行目を次のように変更します。

credentials = ServiceAccountCredentials.from_json_keyfile_name(
    '../../../' + file_name, scopes)

Mac用アプリを作成すると、.appというパッケージになるので、実際に動くプログラムは、アプリケーション.app>Contents>MacOSフォルダに格納されます。

なので、実行プログラムから、jsonファイルをMac用アプリと同じ階層においた場合、その階層にあるファイルを読み込む必要があるので、3階層上を意味する../../../を加えています。

この変更を忘れると、秘密鍵を読み込めないため、プログラムがきちんと動きませんので、変更を忘れないようにしましょう。

この変更したファイルcontrol.pyinterface.pyを元に、py2appでsetup.pyを作成して、中身をカスタマイズして、Mac用アプリを作成します。

Virtualenvを作成

py2appライブラリについては以前学習しましたので、こちらの記事を参考にしてください。

普段から使用しているPycharmのPython環境は、作ったアプリには不要なライブラリがたくさん入っているので、その環境のままpy2appでMac用アプリを作ると、Python環境もそのままアプリのパッケージに入るため、サイズが大きくなるうえ、完了までめちゃくちゃ時間がかかり、さらにエラーも起こることがあります。

なので、virturalenvで新しいPython環境を作って、必要なライブラリをインストールしてからsetup.pyを作成し、Mac用アプリを作成します。

まず、ターミナルから次のコマンドを実行して、testgs(任意の名前)というvirturalenv環境を整えます。

virtualenv testgs
source testgs/bin/activate

続いて、必要なライブラリをインストールします。

pip install py2app
pip install gspread
pip install oauth2client

これらのコマンドで、3つのライブラリをpipインストールします。

setup.pyの作成

必要なライブラリをインストールしたら、次のコマンドを実行して、setup.pyを作成します。

py2applet --make-setup interface.py

interface.pyをもとにpy2appsetup.pyを作成するコマンドです。

"""
This is a setup.py script generated by py2applet

Usage:
    python setup.py py2app
"""

from setuptools import setup

APP = ['interface.py']
DATA_FILES = []
OPTIONS = {}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

作成されたsetup.pyは上記のようになっているので、10行目から12行目を、次のようなコードに変更します。

APP = ['interface.py']
APP_NAME = 'Access Sheets'
DATA_FILES = []
OPTIONS = {
    'iconfile':'clipboard.icns',
	'plist': {
		'CFBundleName': APP_NAME,
		'CFBundleDisplayName': APP_NAME,
		'CFBundleGetInfoString': "Access Sheets",
		'CFBundleIdentifier': "com.udemyfun.Access Sheets",
		'CFBundleVersion': "1.0",
		'CFBundleShortVersionString': "1.0",
		'NSHumanReadableCopyright': "Copyright (C) 2020, MasterU, All Rights Reserved"
	}
}

まず、11行目でアプリの名前をAccess Sheetsにしています。

あとは、13行目のOPTIONSに必要な値を追加しています。

14行目のiconfileは、アイコンのファイルを指定しています。

15行目以降のplistは作成したアプリの詳細情報を指定しているファイルで、アプリの名前や【情報を見る】で表示される情報などを指定しています。

アプリ用アイコンのダウンロード

setup.pyで、アプリのアイコンファイルを指定しているので、setup.pyと同じ階層にclipbord.icnsという名前のアイコンファイルを用意する必要があります。

今回は【IconArchive】からダウンロードしたアイコンファイルの名前をclipboard.icnsに変更しました。

PythonからGoogleスプレッドシートを操作するMac用アプリ

Mac用アイコンは、自分でも作成可能でその作り方をこちらの記事で紹介しているので、時間のある方は参考に自分で作ってみてもいいかもしれません。

setup.pyの実行

setup.pyを変更して、アイコンファイルを同じ階層に移動させたら、ターミナルからsetup.pyを下記のコマンドで実行します。

python setup.py py2app

確認になりますが、setup.pyの実行は、最初に作ったvirtualenv環境のtestgsでターミナルからコマンドを実行しましょう。

完了まで少し時間がかかりますが、distフォルダが作成され、そこにAccess Sheets.appができているので、同じ階層に秘密鍵のjsonファイル(secretkey.json)を移動します。

PythonからGoogleスプレッドシートを操作するMac用アプリ

アプリの実行

アプリが完成すれば、あとはAccess Sheets.appをダブルクリックで起動すると入力フォームが表示されるので、必要な情報を入力して、【計算】をクリックすれば、Googleスプレッドシートに計算した値が入力されています。

PythonからGoogleスプレッドシートを操作するMac用アプリ

昨日からの続きでGoogle Cloud Platformの設定やGoogleスプレッドシートの共有設定はすっ飛ばしていますが、もちろんこれらの設定は必要ですのでお忘れなく。

動作確認

計算内容は昨日のものと同じですが、Mac用アプリなので、起動するところから動画にしてみました。

前回作ったGoogle検索の結果からタイトルとURLをCSVに書き出すMac用アプリは、うまくCSVに書き出せませんでしたが、今回のアプリはきちんとGoogleスプレッドシートに出力することができました。

まとめ

いろいろと調べながら作ったアプリがきちんと動作すると、めっちゃ嬉しくなっちゃいます。

前回のアプリは、最終的にCSVに書き出せず、その原因もわからずじまいだったのですが、今回は無事スプレッドシートに計算結果を出力できたので、うまく動いたときは、めっちゃアドレナリンが出ているのがわかるくらい興奮しました。

学習した内容を記事にまとめると、さらっとスムーズにできている感が出てしまいますが、実は単純なスペルミスがあったり、変な間違いをしていたりして、うまく動くまでにはかなり苦労しています。

それだけに、失敗しながらうまくできたときには喜びもひとしおで、また次のプログラムを書こうという気持ちになるので、少しずつPythonへの理解が深まってきているような気がしています。

この経験を積み上げて、役に立つプログラムを作れるようにPython学習を継続していきたいと思います。

継続は力なり

それでは、明日もGood Python!