【问题标题】:How to update google drive files如何更新谷歌驱动器文件
【发布时间】:2020-01-29 15:17:48
【问题描述】:

这就是我想要做的:

data = drive.files().get_media(fileId=fileId).execute()
csvData = [row.split(",") for row in str(data, 'latin-1').split("\n")]
ar = []
temp = []
for i, row in enumerate(csvData):
    if "".join(row) != "":
        temp.append(row)
    else:
        ar.append(temp)
        temp = []
    if i == len(csvData) - 1:
        ar.append(temp)

# Create request body for the method of spreadsheets.create of Sheets API. [Tanaike]
sheetsObj = []
for sheet in ar:
    tempRow = []
    for row in sheet:
        tempCol = []
        for col in row:
            tempCol.append({"userEnteredValue": {"stringValue": col}})
        if len(tempCol) != 0:
            tempRow.append({"values": tempCol})
    if len(tempRow) != 0:
        sheetsObj.append({"data": [{"rowData": tempRow}]})

# Request to Sheets API. [Tanaike]
body = {"properties": {"title": "spreadsheetTitle"}, "sheets": sheetsObj}
res = sheets.spreadsheets().create(body=body).execute()
print(res)

我最近问了一个关于通过 google API 将文件上传到 google drive 的问题。我在代码上取得了成功,但现在我意识到我需要一个单独的代码,而不是将数据上传到新文件中,而是更新现有的 google 表格。

我一直在与 batchUpdate() (https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/batchUpdate) 作斗争,因为我不知道如何将旧的 sheetObj 解决方案融入其中。

思路和这里一样:Google docs formatting, converting texts into sheets

我希望使用 .txt 格式的数据更新现有的 google 表格文件,但不是简单地上传并因此创建新文件,而是希望更新我目前拥有的现有 google 表格文件。

  • 这个想法是覆盖现有文件中的任何内容。假设文件 id 是已知的。

ps.:发生了一些我之前没有注意到的奇怪事情:所有单元格都以 ' 开头,我正在尝试处理它,但如果有人在我做之前弄清楚了,请将其包含在解决方案中。

【问题讨论】:

    标签: python google-drive-api google-sheets-api


    【解决方案1】:
    • 您希望使用来自以下值的 CSV 数据更新现有电子表格。值来自Google docs formatting, converting texts into sheets

      ID, NAME, MOBILE, CITY, COUNTRY, BIRTHDAY, 
      3, NameGoesHere1, 21 98658 5548, abcity, countryNameHere, 1998-05-02, 
      6, SomeoneElse Joined Here, 21 98535 1218, whereland, Far far away, 1989-11-15, 
      5, AnotherCustomer, 21 85482 5245, somecity, Somewhereland, 1999-08-04, 
      
      ID, PRICE, STOCK, ASDF, BASDF, CASDF,
      
      ID, NAME, PRICE, DESCRIPTION, 
      2, pen, 1.5, The pen is mightier than the sword, 
      3, pencil, 1.0, Can be used to write, 
      4, RPG, 150.0, well that escalated quickly, huh, 
      
      EMPTY, 
      names, 
      goofs, 
      
      ID, FLAVOR, 
      
    • 现有的电子表格有 5 个工作表,用于使用 5 个工作表的 CSV 数据进行更新。

    • 您希望使用 google-api-python-client 和 python 来实现此目的。
    • 您已经能够使用 Sheets API 获取和放置电子表格的值。

    如果我的理解是正确的,那么这个答案呢?请认为这只是几个可能的答案之一。

    流程:

    1. 从 CSV 文件中检索值。
    2. 解析每个工作表的值,并创建请求正文。
    3. 使用已创建的请求正文请求现有电子表格。
      • 在本例中,我使用了电子表格.values.batchUpdate 的方法。

    修改脚本:

    在运行脚本之前,请设置csvFileIdspreadsheetIdsheetNames的变量。

    csvFileId = '###'  # Please set the CSV file ID.
    spreadsheetId = '###'  # Please set the Spreadsheet ID.
    sheetNames = ['Sheet1', 'Sheet2', 'Sheet3', 'Sheet4', 'Sheet5']  # Please set the sheet names in the Spreadsheet for updating.
    
    sheets = build('sheets', 'v4', credentials=creds)
    drive = build('drive', 'v3', credentials=creds)
    
    # Retrieve data from Google Drive and parse data as an array.
    data = drive.files().get_media(fileId=csvFileId).execute()
    csvData = [row.split(",") for row in str(data, 'utf-8').split("\n")]
    ar = []
    temp = []
    for i, row in enumerate(csvData):
        if "".join(row) != "":
            row = [v.strip() for v in row]
            temp.append(row)
        else:
            ar.append(temp)
            temp = []
        if i == len(csvData) - 1:
            ar.append(temp)
    
    valuesUpdateReq = []
    for i, sheet in enumerate(ar):
        if bool(sheet):
            sheetName = sheetNames[i]
            valuesUpdateReq.append({"values": sheet, "range": sheetName, "majorDimension": "ROWS"})
    
    # Request to Sheets API.
    batch_update_values_request_body = {"data": valuesUpdateReq, "valueInputOption": "USER_ENTERED"}
    res = sheets.spreadsheets().values().batchUpdate(spreadsheetId=spreadsheetId, body=batch_update_values_request_body).execute()
    print(res)
    

    注意:

    • 在上面的脚本中,值通过“USER_ENTERED”放入电子表格。这样,这些值可以被解析为字符串、数字和日期。而且,不使用字符顶部的单引号。

    参考:

    如果我误解了您的问题并且这不是您想要的方向,我深表歉意。

    【讨论】:

    • 这解决了每个单元格中' 的问题,但是,现在我看到一些数字单元格被解释为日期......如果一个数字以xy.zw0000.... 格式写入,它转换为日期:18.500 变为 18/05/2020(以 dd/mm/yyyy 格式),例如
    • 感谢您的回复。我带来的不便表示歉意。所以关于18.500,在我的环境中,当脚本运行时,它不会变成18/05/2020 (in dd/mm/yyyy format)。该值作为数字输入。我已经测试了您提供的示例值,并确认该脚本有效。所以我提出了这个示例脚本。我无法理解您要使用的其他值。我对此深表歉意。但是,如果可以,您能否提供值和脚本以完全复制您的情况?通过这个,我想检查一下。如果您能合作解决您的问题,我很高兴。
    • 我在另一个问题中解决了这个问题:谷歌表格使用我的语言环境作为它转换为日期的解释器 - 因为我在巴西本地化,所以我的浮点数都变成了日期,但我可以转到工作表配置并将其设置在其他位置 - 这可以解决问题(我只是希望我可以将其编码为某个区域设置)
    • @5Daydreams 感谢您的回复和其他信息。
    猜你喜欢
    • 2016-06-22
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2017-01-29
    • 2012-08-10
    相关资源
    最近更新 更多