web-dev-qa-db-ja.com

Google Sheets API V4を使用してCSVファイルをインポートする方法

バックグラウンド

SQLテーブルのデータを分析し、最後にCSVファイルを生成するPython 2.7スクリプトを開発しています。

ファイルが生成されたら、Googleシートアカウントにログインし、インポートオプションを使用してCSVファイルをGoogleスプレッドシートにインポートします

肉体労働はちょっとバカなので、この機能をスクリプトに追加したいと思います。

Google Sheets API V4

したがって、私はこのガイド Python Quickstart に従い、すべてのステップを完了することができました。

次に Google Sheets APIリファレンス をたどり、 Method:Sheets.create を調べました。私が正しく理解していれば、ファイルからインポートするオプションは提供されていません。

インポート機能用のAPIがないようです。

質問

Google Sheets API V4を使用してCSVファイルをインポートする方法彼らの例/参照は私が欠けていますか?

12
idanshmu

サムベルリンの答えの別の選択肢。 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)

関連質問: gspreadを使用してCSVをGoogleスプレッドシートにアップロード

0
Burnash

G CSVファイルをインポートするには、2つのオプションがあります。 Drive API を使用してCSVからスプレッドシートを作成するか、Sheets APIを使用して create 空のスプレッドシートを作成してから spreadsheets.batchUpdateを使用できます。PasteDataRequest を使用してCSVデータを追加します。

12
Sam Berlin

私はバーナッシュの 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の自動(正しい)処理を利用していることに注意してください。

4
CapoChino

私は他の答えを機能させるために数時間を費やしました。ライブラリは認証を適切に説明しておらず、認証情報を処理するGoogle提供の方法では機能しません。一方、Samの回答では、APIの使用の詳細については詳しく説明していません。だから、ここにCSVをgSheetsにアップロードする完全なレシピがあります。サムの回答とカポチノの回答の両方に加えて、私自身の調査の一部を使用しています。

  1. 認証/セットアップ。一般に、 docs [.____を参照してください。]
    • 大きな青いボタンを押すと、追加の手順なしでcredentials.jsonが表示されます
    • quickstart.pyauthenticate.pyに簡単に適応できます
    • スコープにはhttps://www.googleapis.com/auth/spreadsheetsを含める必要があります

うまくいけば、これで資格情報が保存されたので、実際のコードに移りましょう

  1. すぐに使えるレシピ:
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でテストされていますが、このスレッドはコードを送信するのに最も適しているようです。

3
Ufos

サムベルリンの答えの代わりに、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()

私には問題なく動作します。

0
Jordie Bellé