SQLテーブルのデータを分析し、最後にCSVファイルを生成するPython 2.7
スクリプトを開発しています。
ファイルが生成されたら、Googleシートアカウントにログインし、インポートオプションを使用してCSVファイルをGoogleスプレッドシートにインポートします
肉体労働はちょっとバカなので、この機能をスクリプトに追加したいと思います。
したがって、私はこのガイド Python Quickstart に従い、すべてのステップを完了することができました。
次に Google Sheets APIリファレンス をたどり、 Method:Sheets.create を調べました。私が正しく理解していれば、ファイルからインポートするオプションは提供されていません。
インポート機能用のAPIがないようです。
Google Sheets API V4を使用してCSVファイルをインポートする方法彼らの例/参照は私が欠けていますか?
サムベルリンの答えの別の選択肢。 Pythonを使用している場合、Drive APIを gspread で使用してCSVファイルをインポートできます。次に例を示します。
import gspread
# Check how to get `credentials`:
# https://github.com/burnash/gspread
gc = gspread.authorize(credentials)
# Read CSV file contents
content = open('file_to_import.csv', 'r').read()
gc.import_csv('<SPREADSHEET_ID>', content)
G CSVファイルをインポートするには、2つのオプションがあります。 Drive API を使用してCSVからスプレッドシートを作成するか、Sheets APIを使用して create 空のスプレッドシートを作成してから spreadsheets.batchUpdateを使用できます。PasteDataRequest を使用してCSVデータを追加します。
私はバーナッシュの gspread ライブラリが好きですが、彼の答えのimport_csv
関数は限られています。常に最初のワークシート(タブ)のA1
から貼り付けを開始し、他のすべてのタブを削除します。
特定のタブとセルから貼り付けを開始する必要があったので、PasteDataRequestを使用するというSam Berlinの提案に従いました。これが私の機能です:
def pasteCsv(csvFile, sheet, cell):
'''
csvFile - path to csv file to upload
sheet - a gspread.Spreadsheet object
cell - string giving starting cell, optionally including sheet/tab name
ex: 'A1', 'MySheet!C3', etc.
'''
if '!' in cell:
(tabName, cell) = cell.split('!')
wks = sheet.worksheet(tabName)
else:
wks = sheet.sheet1
(firstRow, firstColumn) = gspread.utils.a1_to_rowcol(cell)
with open(csvFile, 'r') as f:
csvContents = f.read()
body = {
'requests': [{
'pasteData': {
"coordinate": {
"sheetId": wks.id,
"rowIndex": firstRow-1,
"columnIndex": firstColumn-1,
},
"data": csvContents,
"type": 'PASTE_NORMAL',
"delimiter": ',',
}
}]
}
return sheet.batch_update(body)
高位のupdate_cells
メソッドではなくraw pasteDataリクエストを使用して、引用符で囲まれた文字列を含む入力データのGoogleの自動(正しい)処理を利用していることに注意してください。
私は他の答えを機能させるために数時間を費やしました。ライブラリは認証を適切に説明しておらず、認証情報を処理するGoogle提供の方法では機能しません。一方、Samの回答では、APIの使用の詳細については詳しく説明していません。だから、ここにCSVをgSheetsにアップロードする完全なレシピがあります。サムの回答とカポチノの回答の両方に加えて、私自身の調査の一部を使用しています。
credentials.json
が表示されますquickstart.py
はauthenticate.py
に簡単に適応できますhttps://www.googleapis.com/auth/spreadsheets
を含める必要がありますうまくいけば、これで資格情報が保存されたので、実際のコードに移りましょう
import pickle
from googleapiclient.discovery import build
SPREADSHEET_ID = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms' # Get this one from the link in browser
worksheet_name = 'Sheet2'
path_to_csv = 'New Folder/much_data.csv'
path_to_credentials = 'Credentials/token.pickle'
# convenience routines
def find_sheet_id_by_name(sheet_name):
# ugly, but works
sheets_with_properties = API \
.spreadsheets() \
.get(spreadsheetId=SPREADSHEET_ID, fields='sheets.properties') \
.execute() \
.get('sheets')
for sheet in sheets_with_properties:
if 'title' in sheet['properties'].keys():
if sheet['properties']['title'] == sheet_name:
return sheet['properties']['sheetId']
def Push_csv_to_gsheet(csv_path, sheet_id):
with open(csv_path, 'r') as csv_file:
csvContents = csv_file.read()
body = {
'requests': [{
'pasteData': {
"coordinate": {
"sheetId": sheet_id,
"rowIndex": "0", # adapt this if you need different positioning
"columnIndex": "0", # adapt this if you need different positioning
},
"data": csvContents,
"type": 'PASTE_NORMAL',
"delimiter": ',',
}
}]
}
request = API.spreadsheets().batchUpdate(spreadsheetId=SPREADSHEET_ID, body=body)
response = request.execute()
return response
# upload
with open(path_to_credentials, 'rb') as token:
credentials = pickle.load(token)
API = build('sheets', 'v4', credentials=credentials)
Push_csv_to_gsheet(
csv_path=path_to_csv,
sheet_id=find_sheet_id_by_name(worksheet_name)
)
batchUpdate
を直接使用することの良い点は、数千行を1秒間にアップロードすることです。低レベルではgspread
も同じように機能し、パフォーマンスは同じです。 gspread-pandas もあります。
pSコードはpython 3.5
でテストされていますが、このスレッドはコードを送信するのに最も適しているようです。
サムベルリンの答えの代わりに、CSVをリストのリストに変換して、それをPOSTペイロードに設定できます。
このような関数は次のようになります。
def preprocess(table):
table.to_csv('pivoted.csv') # I use Pandas but use whatever you'd like
_file = open('pivoted.csv')
contents = _file.read()
array = contents.split('\n')
master_array = []
for row in array:
master_array.append(row.split(','))
return master_array
そのマスター配列は以下にスローされます:
body = {
'values': newValues
}
result2 = service.spreadsheets().values().update(spreadsheetId=spreadsheetId, range=rangeName + str(len(values) + start + 1), valueInputOption="USER_ENTERED", body=body).execute()
私には問題なく動作します。