如何使用Google表格API V4导入CSV文件

时间:2017-02-21 08:56:13

标签: python-2.7 google-spreadsheet-api google-sheets-api

背景

我正在开发一个Python 2.7脚本,用于分析SQL表中的数据,最后生成一个CSV文件。

生成文件后,我正在登录我的Google工作表帐户,并使用导入选项将我的CSV文件导入到Google电子表格中

手工劳动有点愚蠢,我希望将这种能力添加到我的剧本中。

Google表格API V4

所以,我按照本指南Python Quickstart完成了所有步骤。

然后我跟着Google Sheets API reference并查看了Method: spreadsheets.create。如果我理解正确,它不提供从文件导入的选项。

似乎没有导入功能的API。

问题

如何使用Google表格API V4导入CSV文件?他们是我缺少的一个例子/参考吗?

5 个答案:

答案 0 :(得分:10)

您有两种导入g CSV文件的选项。您可以使用Drive API从CSV创建电子表格,也可以使用表单API将create空电子表格用于spreadsheets.batchUpdate,然后使用PasteDataRequest添加{{3}}来添加CSV数据。

答案 1 :(得分:4)

我喜欢Burnash的gspread库,但是他的答案中的import_csv功能有限。它总是从第一个工作表(标签)A1开始粘贴,并删除所有其他标签

我需要从特定的选项卡和单元格开始粘贴,因此我接受了Sam Berlin的建议使用PasteDataRequest。这是我的功能:

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)

请注意,我使用原始的pasteData请求而不是更高级别的update_cells方法来利用Google对包含引号的字符串(可能包含非定界逗号)的输入数据的自动(正确)处理。 / p>

答案 2 :(得分:2)

我已经花了几个小时试图使其他答案起作用。库无法很好地说明身份验证,也无法与Google提供的处理凭据的方式一起使用。 另一方面,Sam的答案并未详细说明使用API​​的细节,这有时可能会造成混淆。 因此,这是将CSV上传到gSheets的完整方法。它同时使用了Sam和CapoChino的答案以及我自己的一些研究。

  1. 验证/设置。通常,请参考docs
    • 蓝色大按钮将使您credentials.json无需任何额外步骤
    • quickstart.py可以轻松地改编为authenticate.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的好处是,它每秒可以上传数千行。在较低级别,gspread会执行相同的操作,因此应与性能相同。也有gspread-pandas

p.s。该代码已使用python 3.5测试,但该线程似乎最适合提交给该线程。

答案 3 :(得分:0)

作为Sam Berlin的答案的替代方案,您可以将CSV转换为列表列表并将其设置为POST有效负载。

这样的功能看起来像这样:

<input type="radio" id="rad1" name="rad" value="choice 1">
<label for="rad1">Choice 1</label>

<input type="radio" id="rad2" name="rad" value="choice 2">
<label for="rad2">Choice 2</label>

<input type="radio" id="rad3" name="rad" value="choice 3">
<label for="rad3">Choice 3</label>

<p><button id="getChecked">Get the checked radio button value</button></p>

主数组被抛入以下内容:

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

它适用于我。

答案 4 :(得分:0)

山姆·柏林的答案的另一种选择。如果您使用的是Python,则可以通过gspread使用Drive API导入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)

相关问题:Upload CSV to Google Sheets using gspread