Sheets APIを使いスプレッドシートの複数の範囲を取得する


Sheets APIを使いスプレッドシートの複数の範囲を取得する

スクレイピング時に必要な設定値をグーグルスプレッドシートから一括で取得したい。
検索しても単一の範囲を取得するものばかりでなかなかでてこなかったのでメモ。

離れた範囲を取得する場合
#batchGetを使います
https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchGet

・環境
Windows10
Python3.9
すでにスプレッドシートAPIを使う手続き済んでおり、動作確認済みとする。
トークンファイルも、秘密鍵もpythonファイルと同じ場所にある。
サンプルなので鍵の管理については考慮無し。


例：
スプレッドシートの「設定」シートに名前付き範囲が3か所ある。
名前付き範囲3か所それぞれの値をいっぺんに取得したい。

|名前付き範囲|名前付き範囲の場所|
|---|---|
|endpage|設定!E2|
|startpage|設定!D2|
|getrange|設定!A1:B3|

こんな感じ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369082/dfa3eb5b-1325-787b-c99f-18bd05ccc31b.png)

#ポイント
##①batchGetを使う
https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/batchGet

##②名前範囲をリストにして渡す。

##③リターンされた値のvalueRangesが名前付き範囲の値。
全貌は下記参照



```:python
from __future__ import print_function
import os.path
import pathlib
import sys
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials 


        
def getspredconnect():
   
    SPREADSHEET_ID="1×××EsYNg9MO〇〇〇pRDu95P4ABpmy×××〇〇rbh-x3XxvDg0" #スプレッドシートのID
    #スプレッドシートの名前付き範囲をリストにする　「設定」シートに名前付き範囲があるものとする
    RANGES=[]
    RANGES.append("設定!startpage")
    RANGES.append("設定!endpage")
    RANGES.append("設定!getrange")

    jsonfile="client_secret_pps.googleusercontent.com.json"  #認証用のカギ
    SCOPES=['https://www.googleapis.com/auth/drive','https://www.googleapis.com/auth/spreadsheets'] 
    
    
    args = sys.argv
    p_tmp =pathlib.Path(os.path.dirname(sys.argv[0]))
    jsonfull = os.path.join(os.path.dirname(sys.argv[0]), jsonfile)
    tokenpath = os.path.join(os.path.dirname(sys.argv[0]), "token.json")
    creds = None
    # The file token.json 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(tokenpath):
        creds = Credentials.from_authorized_user_file(tokenpath, SCOPES)

    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(
                jsonfull, SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open(tokenpath, 'w') as token:
            token.write(creds.to_json())

    service = build('sheets', 'v4', credentials=creds)       
    
    
    #sheet = service.spreadsheets()
    request = service.spreadsheets().values().batchGet(spreadsheetId=SPREADSHEET_ID, ranges=RANGES)
    response = request.execute()       
    
    #リターンされた値を取得する
    #リターンされた値の全貌は下参照
    aa = response.get('valueRanges', []) 
    

    #どのような値がリターンされているか確認
    for jsonObj in aa:
        print(jsonObj["values"])   
    
    #名前付き範囲の値を個別に取得
    print(aa[0]['values'][0][0])
    print(aa[1]['values'][0][0])
    print(aa[2]['values'][0][1])        
        


if __name__ == '__main__':
   
   getspredconnect()
   
```

#リターンされた値

```
{
  "spreadsheetId": "1×××EsYNg9MO〇〇〇pRDu95P4ABpmy×××〇〇rbh-x3XxvDg0",
  "valueRanges": [
    {
      "range": "'設定'!D2",
      "majorDimension": "ROWS",
      "values": [
        [
          "1"
        ]
      ]
    },
    {
      "range": "'設定'!E2",
      "majorDimension": "ROWS",
      "values": [
        [
          "10"
        ]
      ]
    },
    {
      "range": "'設定'!A1:B3",
      "majorDimension": "ROWS",
      "values": [
        [
          "食べログ新店舗一覧取得",
          "〇"
        ],
        [
          "ヤフー取得",
          "×"
        ],
        [
          "グーグル検索取得",
          "×"
        ]
      ]
    }
  ]
}

```

グーグルで検索しても、
単一の範囲を取得するものばかりで。
困って、APIの説明ページをポチポチしていたら偶然みつけました。
最初からAPIの説明ページを見ればよかった。

スクレイピングの設定ファイルをローカルにあるエクセルファイルから
スプレッドシートに順次変更しています。
早くなりました。