LoginSignup
0
1

More than 3 years have passed since last update.

グーグルドライブAPIを使ってスプレッドシートをxlsxでダウンロード、pythonで

Posted at

グーグルドライブAPIというものがありこれを使えばブラウザにアクセスしなくてもダウンロードできるぞと書いてあったが思いの外手こずったのでメモ

APIキーやOAuthを手に入れる方法は他にあるので割愛
また、コードはpythonで書く。
調べてみたところやれることはスコープによって変わるようだ

# これでダウンロードや書き込み、読み込み、その他諸々が自由になる。
SCOPES = ['https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.metadata.readonly']
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseDownload
from google_auth_oauthlib.flow import InstalledAppFlow 
from google.auth.transport.requests import Request


def getfile():
    """
    ファイルをダウンロードするだけの簡単な関数。
    """
    with open('token.pickle', 'rb') as token:
        creds = pickle.load(token)

    service = build('drive', 'v3', credentials=creds)
    file_id = '1lllnzSFApok_umno0gsXotykBSjOOBgCr85F6gM1ed4'
    file_name = 'chatwork_test.xlsx'
    request = service.files().export_media(fileId=file_id, mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    fh = io.BytesIO()
    downloader = MediaIoBaseDownload(fh, request)
    done = False
    while done is False:
        status, done = downloader.next_chunk()
        print("Download %d%%." % int(status.progress() * 100))

    fh.seek(0)

    with open(os.path.join('./resultFile', file_name), 'wb') as f:
        f.write(fh.read())
        f.close()


if __name__ == '__main__':
    getfile()

コードを見るとわかるように

request = service.files().export_media(fileId=file_id, mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')

ここのmimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'でspreadsheetをexcelファイルに変換し、

file_name = 'chatwork_test.xlsx'
fh = io.BytesIO() # ファイルをバイナリで開く、エクセルファイルはバイナリだから
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print("Download %d%%." % int(status.progress() * 100))

ここで実際にダウンロードを行うわけだがここの処理をよく理解していなかった。
このあたりの処理はいわゆるf.open('hoge', 'rb')しただけと大体一緒なのでその後に書き込む処理をしなければならなかったのだ。
つまり「ダウンロードしました(ダウンロードしたとはいってない)」と同じ状態なのである。したがって。

    fh.seek(0)

    with open(os.path.join('./resultFile', file_name), 'wb') as f:
        f.write(fh.read())
        f.close()

これらの処理が必要になる。
正直このfh.seek(0)の意味がよくわかっていない、

参考になった動画

Google Drive API in Python | Download Files (注:英語)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1