Python к соединителю листов Google без ключевого файла - PullRequest
0 голосов
/ 19 апреля 2020

Мне удалось получить Python для чтения из Google Sheet. Однако, поскольку я использую сценарий из PowerBI для чтения из Google Sheet, я не могу использовать файл локального секретного ключа JSON на своем компьютере, так как PowerBI не может получить доступ к этому файлу. В настоящее время я подключаюсь к листу следующим образом:

scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json(r'C:\Users\Laila\Documents\google_spreadsheet_secret_key.json', scope)
gc = gspread.authorize(credentials)
return gc,credentials

Я хотел бы сделать что-то вроде этого:

secret_key={xxx:xxx}
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json(secret_key)
gc = gspread.authorize(credentials)
return gc,credentials

Возможно ли это?

Я уже пытался добавить секретный ключ с JSON создает дамп и добавляет его таким образом, что выдает следующую ошибку:

        ---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-85-0b15fbe84ead> in <module>

----> 8 onboarding_yearmonth=get_onboarding_year_month()

<ipython-input-30-ff93a4b40320> in get_onboarding_year_month()
      1 def get_onboarding_year_month():
----> 2     onboarding_sheet = read_onboarding_sheet()
      3     onboarding_row=onboarding_sheet.loc[onboarding_sheet['ID'] == str(client_id)]
      4     onboarding_row = onboarding_row.iloc[0]['Live date']
      5     onboarding_dt = parse(onboarding_row)

<ipython-input-28-d0961c0ce7d1> in read_onboarding_sheet()
      1 def read_onboarding_sheet():
----> 2     gc,credentials = connect_to_gsheets()
      3     spreadsheet_key = '1zeUiWGMWp-xxx'
      4     spreadsheet = gc.open_by_key(spreadsheet_key)
      5     worksheet = spreadsheet.worksheet("Onboarding Dates")

<ipython-input-82-7b436cef1e5e> in connect_to_gsheets()
      1 def connect_to_gsheets():
      2     scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
----> 3     credentials = ServiceAccountCredentials.from_json(secret_key)
      4     gc = gspread.authorize(credentials)
      5     return gc,credentials

c:\users\laila\appdata\local\programs\python\python36-32\lib\site-packages\oauth2client\service_account.py in from_json(cls, json_data)
    440         password = None
    441         if pkcs12_val is None:
--> 442             private_key_pkcs8_pem = json_data['_private_key_pkcs8_pem']
    443             signer = crypt.Signer.from_string(private_key_pkcs8_pem)
    444         else:

KeyError: '_private_key_pkcs8_pem'

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Согласно ServiceAccountCredentials.from_ json документации вы можете передать уже проанализированный словарь.

Вы можете скопировать содержимое файла в виде строки в переменную и затем загрузить их как объект словаря, используя json.loads().

import json


# store contents of 'C:\Users\Laila\Documents\google_spreadsheet_secret_key.json' in secrets
secrets = 'STORE_FILE_CONTENT_HERE' # Use single quotation to wrap the content
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json(json.loads(secrets), scope)
gc = gspread.authorize(credentials)
return gc,credentials

Отказ от ответственности : я не проверял это.

Ссылка

0 голосов
/ 04 мая 2020

Это сработало:

import numpy as np
import pandas as pd
pd.options.mode.chained_assignment = None
import re
import gspread
import csv
from oauth2client.service_account import ServiceAccountCredentials
from df2gspread import df2gspread as d2g
import glob
from datetime import datetime
from datetime import date
import calendar
import requests
from dateutil.parser import parse
import json
import oauth2client
from oauth2client import _helpers
from oauth2client import client
from oauth2client import crypt
from oauth2client import transport


def connect_to_gsheets():
    scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']
    credentials = ServiceAccountCredentials._from_p12_keyfile_contents(
        "email from service account insert here",
         "-----BEGIN PRIVATE KEY-----\ xxxx\n-----END PRIVATE KEY-----\n"
        ,private_key_password=None, scopes=scope,
        token_uri="https://oauth2.googleapis.com/token",
        revoke_uri=oauth2client.GOOGLE_REVOKE_URI)
   # credentials = ServiceAccountCredentials.from_json(json.loads(secrets), scope)
    gc = gspread.authorize(credentials)
    return gc,credentials
def read_cost_sheet():
    gc,credentials = connect_to_gsheets()
    spreadsheet_key = 'xxxx'
    spreadsheet = gc.open_by_key(spreadsheet_key)
    worksheet = spreadsheet.worksheet("DATA")
    list_of_lists = worksheet.get_all_values()
    onboarding_dates=pd.DataFrame(list_of_lists)
    onboarding_dates.columns = onboarding_dates.iloc[0]
    return onboarding_dates

cost_data=read_cost_sheet()
print(cost_data)

см. Также здесь; Мой JSON ключ API не в правильном формате

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...