RaspberryPi 3 Model B+からGoogleスプレッドシートへアクセスする方法 | そう備忘録

RaspberryPi 3 Model B+からGoogleスプレッドシートへアクセスする方法

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

16件のフィードバック

  1. より:

    まさしくやってみたい事だと思い試した結果、以下のエラーがでました。
    宜しければアドバイス頂けますと幸いです。

    python test.pyを実行した結果

    Traceback (most recent call last):
    File “test.py”, line 3, in
    import gspread
    File “/home/pi/gspread.py”, line 10, in
    gc = gspread.authorize(credentials)
    NameError: name ‘gspread’ is not defined

    • souichirou より:

      ゆ さんこんにちは

      gspreadがプログラムから見れない状態だと思います。
      記事中の

      sudo pip3 install gspread

      のコマンドは正常に終了しましたか。
      またはインストールした時のアカウントと実行時のアカウントが異なっている事はありませんか?

      pip show gspread

      でgspreadのインストール場所が分かります。
      もし正しくインストールされていてpathが通っていないだけであれば、プログラムソース中に

      import sys
      sys.path.append('上記コマンドで表示されたgspreadのインストールpath')

      を指定してみてください

      結果を教えて貰えるとありがたいです。

      • より:

        丁寧にご返答頂きありがとうございます。

        :~ $ pip show gspread
        WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
        Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
        To avoid this problem you can invoke Python with ‘-m pip’ instead of running pip directly.
        DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. pip 21.0 will drop support for Python 2.7 in January 2021. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
        Name: gspread
        Version: 3.6.0
        Summary: Google Spreadsheets Python API
        Home-page: https://github.com/burnash/gspread
        Author: Anton Burnashev
        Author-email: fuss.here@gmail.com
        License: MIT
        Location: /home/pi/.local/lib/python2.7/site-packages
        Requires: google-auth-oauthlib, requests, google-auth
        Required-by:

        と出たので、ソースを以下のようにしました。

        #!/usr/bin/env python
        # -*- coding: utf-8 -*-
        import sys
        sys.path.append(‘/home/pi/.local/lib/python2.7/site-packages’)

        import json
        from oauth2client.service_account import ServiceAccountCredentials
        scope = [‘https://www.googleapis.com/auth/drive’]

        credentials = ServiceAccountCredentials.from_json_keyfile_name(‘./python.json’, scope)
        gc = gspread.authorize(credentials)

        worksheet = gc.open(“シート1”).sheet1

        worksheet.update_cell(1,1, ‘Hello World’)

        結果は、以下でした。

        :~ $ python gs.py
        Traceback (most recent call last):
        File “gs.py”, line 12, in
        gc = gspread.authorize(credentials)
        NameError: name ‘gspread’ is not defined

        初心者なもので不明なことだらけです。
        ご教示頂けますと助かります。

        • souichirou より:

          ゆ さん
          こんにちは。
          pip show gspreadの結果を見るとpython2.7にインストールされていて警告が出ていますね。
          ※2.7は2020年1月1にサポートが終了しています。

          元の記事中に

          尚、事前にPythonのデフォルトをPython3にしてある。
          変更方法については以前の記事を参照。(https://www.souichi.club/raspberrypi/aws-iot-01/#DefaltPython3)

          とありますがこの手順を抜かしたのだと思います。
          PythonのデフォルトをPython3に変更した上でインストールするとPython3の環境にgspreadがインストールされます。

          今、2.7にインストールされていますので、
          1.アンインストール
          2.上記記事を元にデフォルトを3.0に変更
          3.再度インストール
          を試して見て下さい。

          P.S. 元記事は分かりにくかったので追記を入れました

  2. より:

    アンインストールでおかしなことになったりしてしまい、OS自体を入れなおして0からやりましたが、症状は変わりませんでした。
    何の設定?がおかしいのか分からない状態です。。。すみません。

    :~ $ python gs.py
    Traceback (most recent call last):
    File “gs.py”, line 10, in
    gc = gspread.authorize(credentials)
    NameError: name ‘gspread’ is not defined

    :/usr/bin $ ls -l

    lrwxrwxrwx 1 root root 7 6? 6 03:18 python -> python3
    lrwxrwxrwx 1 root root 14 3? 5 2019 python-config -> python2-config
    lrwxrwxrwx 1 root root 9 3? 5 2019 python2 -> python2.7
    lrwxrwxrwx 1 root root 16 3? 5 2019 python2-config -> python2.7-config
    -rwxr-xr-x 1 root root 154 12? 30 2018 python2-pbr
    -rwxr-xr-x 1 root root 2984816 10? 11 2019 python2.7
    lrwxrwxrwx 1 root root 36 10? 11 2019 python2.7-config -> arm-linux-gnueabihf-python2.7-config
    lrwxrwxrwx 1 root root 9 3? 26 2019 python3 -> python3.7
    lrwxrwxrwx 1 root root 16 3? 26 2019 python3-config -> python3.7-config
    -rwxr-xr-x 2 root root 4275580 12? 21 03:57 python3.7
    lrwxrwxrwx 1 root root 36 12? 21 03:57 python3.7-config -> arm-linux-gnueabihf-python3.7-config
    -rwxr-xr-x 2 root root 4275580 12? 21 03:57 python3.7m
    lrwxrwxrwx 1 root root 37 12? 21 03:57 python3.7m-config -> arm-linux-gnueabihf-python3.7m-config
    lrwxrwxrwx 1 root root 10 3? 26 2019 python3m -> python3.7m
    lrwxrwxrwx 1 root root 17 3? 26 2019 python3m-config -> python3.7m-config
    lrwxrwxrwx 1 root root 10 3? 26 2019 pyvenv -> pyvenv-3.7
    -rwxr-xr-x 1 root root 436 12? 21 03:57 pyvenv-3.7
    lrwxrwxrwx 1 root root 29 3? 5 2019 pyversions -> ../share/python/pyversions.py

    :~ $ python –version
    Python 3.7.3

    :~ $ pip show gspread
    Name: gspread
    Version: 3.6.0
    Summary: Google Spreadsheets Python API
    Home-page: https://github.com/burnash/gspread
    Author: Anton Burnashev
    Author-email: fuss.here@gmail.com
    License: MIT
    Location: /usr/local/lib/python3.7/dist-packages
    Requires: requests, google-auth-oauthlib, google-auth
    Required-by:

    と出たので、ソースを以下のようにしています。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import sys
    sys.path.append(‘/usr/local/lib/python3.7/dist-packages’)

    import json
    from oauth2client.service_account import ServiceAccountCredentials
    scope = [‘https://spreadsheets.google.com/feeds’,’https://www.googleapis.com/auth/drive’]

    #
    credentials = ServiceAccountCredentials.from_json_keyfile_name(‘./python.json’, scope)
    gc = gspread.authorize(credentials)

    #
    worksheet = gc.open(“シート1”).sheet1

    #
    worksheet.update_cell(1,1, ‘Hello World’)

    • souichirou より:

      ゆ さん
      おはようございます。

      ソース中に、
      import gspread
        ↑
      gspreadモジュールの読み込み
      が無いようです。

      ですので
      gc = gspread.authorize(credentials)
      でgspreadを使おうとして、「gspreadがありません」のエラーになっていると思います。

      P.S. Pythonのデフォルトは3.7になっていて、その環境にgspreadがインストールされているようです。

  3. より:

    アンインストール、インストールを丁寧にやり直したら無事できました。
    ありがとうございます。お騒がせしました。
    大変参考になりました。
    今後も引き続き参考にさせてもらいます。応援しています☆

  4. おじいちゃん より:

    souichirou様
    サイトを参考にさせていただいています。
    ラズパイから、ロードセルで定期的に測定するデータをスプレッドシートに記録することを目指して
    この夏休み期間中にいろいろやってみました。
    まずはサイトとまるっきり同じことをやってみようと思い、プログラムを実行させたら下記のエラーがでました。
    お忙しいところ申し訳ないのですが、対処法などご教示お願いします。

    現在、python3をインストールしています。
    なお、pip show gspreadにてVersion: 3.6.0  Location: /usr/local/lib/python3.7/dist-packages
    Requires: google-auth, requests, google-auth-oauthlib とまではわかっています。

    ここからエラーメッセージーー
    Traceback (most recent call last):
    File “/usr/local/lib/python3.7/dist-packages/gspread/client.py”, line 119, in open
    self.list_spreadsheet_files(title),
    File “/usr/local/lib/python3.7/dist-packages/gspread/utils.py”, line 97, in finditem
    return next((item for item in seq if func(item)))
    StopIteration

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File “/home/pi/hx711py/GoogleSheet-Ethqeq”, line 15, in
    wks = gc.open(sheet_name).sheet1 # sheetをオープン
    File “/usr/local/lib/python3.7/dist-packages/gspread/client.py”, line 127, in open
    raise SpreadsheetNotFound
    gspread.exceptions.SpreadsheetNotFound

    • souichirou より:

      おじいちゃん さんへ

      プログラムからシートが見つからないようです。
      プログラム中の7行目のsheet_nameとGoogle Sheetのシート名(左上のシート名)は
      一致していますか?

      • おじいちゃん より:

        お返事ありがとうございます 現状は下記のとおりです
        プログラム中7行目は sheet_name = ‘jsnpd1’  # シート名
        Google Sheetのシート名(左上のシート名)は jsnpd1
        プロジェクト名も jsnpd1
        にしています

        • souichirou より:

          おじいちゃん さんへ
          シート名は一致していますか。。。
          シート名以外だとすると、
          JSONファイル中のメールアドレスはスプレッドーシートで共有されていますか?
          記事中の「Googleスプレッドシートを作成して共有設定する」の項です。

          一度、Google Sheetsを開いてみて右上の共有ボタンを押してJSONファイル中のメールアドレスが
          共有設定されているかどうかを確認してみて下さい。

          後、念の為の確認ですがシート1はありますよね。
          プログラム中のsheet1はシート1を表しています。
          シート名は変更しても大丈夫の様ですがシート1を削除しているようだとnot foundになるかも知れません。

          また、ちなみにシート名やメールアドレスはコピペで貼り付けていますか?

  5. おじいちゃん より:

    souichirou様
    ありがとうございます。無事できました。
    原因は、
    『Google Sheetsを開いてみて右上の共有ボタンを押してJSONファイル中のメールアドレスが
    共有設定されているかどうかを確認してみて下さい。』で
    何度もやったほずなのですが、共有メール部に反映されていませんでした。本当にありがとうございます。感謝いたします

    ラズベリーパイのプログラム中 
    print(“設定値3”,records[i][2])
    の後に スプレッドシート上で i行の最終列に相当するセルにラズパイで測定したデータを update_acellしたいときのコードは、どのように書けばよろしいでしょうか。最後として教えていただけませんか
    その都度測定値を空白のセルに右方向に移動しながら記録することを考えています
    イメージとしては下記なのですが
    wks.update_acell(i, lastcolumn + 1, val)
    よろしくお願いします。

    • souichirou より:

      おじいちゃん さん
      無事に出来たとの事で何よりです。
      update_acellの件ですがちょっとやりたいことが分かりませんでした。
      該当行の最終列に書き込みたいのであればご提示のコードで良いように思います。
      wks.update_acell(i, lastcolumn + 1, val)

      lastcolumnの値が行によって変わるという事ですかね。
      該当行を見つけて右に移動をしながら最初に空白が見つかった列に書き込めば良いのではないでしょうか。
      コードは適当ですが、

      j = 0
      while records[i][j] != '':
          j += 1

      で最初に見つかった空白の列を探せば良いのではないでしょうか。

      • 匿名 より:

        souichirou 様
        いろいろ教えていただきましてありがとうございます。
        wks.update_cell(i, len(records[i]) + 1, val)
        としてみましたらうまくいくようになりました。

        次は、条件次第でLINEに送信したり、通知することができるように
        機能を追加していく予定です。自助努力で頑張りますが、わからないときは
        お助けください。
        今後ともよろしくお願いします。

        • souichirou より:

          コメントありがとうございます。
          列の最後に挿入するのであれば、len(records[i])+1が良いですね。
          こちらこそよろしくおねがいします。

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。