【问题标题】:How to get only filtered rows from google sheets to python script using google API?如何使用谷歌 API 仅从谷歌表格中获取过滤后的行到 python 脚本?
【发布时间】:2021-06-20 09:00:01
【问题描述】:

我创建了一个 python 脚本,在我的谷歌表上设置一个过滤器。此过滤按预期工作。我现在有兴趣在设置此过滤器后抓取所有行。但是,当我得到 api 调用时,我得到了所有的行。

我认为我在拨打 get 跟注时提供范围是错误的。我以这种格式提供范围Sheet1!A:J。此范围表示从 A 到 J 列中的所有数据。但是,我不知道如何仅提供与过滤数据对应的范围。我在这篇文章 (https://sites.google.com/site/scriptsexamples/learn-by-example/google-sheets-api/filters#TOC-Get-filtered-rows) 中描述的谷歌应用脚​​本中看到了一种解决方案。然而,这是一个非常低效的解决方案。我不想在获取的数据上运行 for 循环。我想阻止获取所有数据,而宁愿只获取过滤后的数据。这可以从 python 脚本中做到吗?

我现在是这样做的

    # print(json.dumps(body, indent=4))
    resp = service.spreadsheets() \
   .batchUpdate(spreadsheetId=SAMPLE_SPREADSHEET_ID, body=body).execute()

    sheet = service.spreadsheets()
    data = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID, range="Sheet1!A:J").execute()
    print(data)

【问题讨论】:

  • 在你的标题中,来自How to get only filtered columns from google sheets to python script using google API?,看来你要检索only filtered columns。但是在您的问题中,从I'm now interested in grabbing all the rows after setting this filter.,您似乎想检索rows。所以我无法理解你的目标。我为此道歉。我可以问你目标的细节吗?
  • 我真的很抱歉这个错误。我的意思是行。例如,我只选择了具有TEXT_EQ"Open" 的行,我想获取特定列中具有"Open" 值的所有行。现在清楚了吗,还是我需要详细说明?
  • 感谢您的回复。从你的回复中,我提出了一个答案。你能确认一下吗?如果这不是您期望的结果,我深表歉意。

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


【解决方案1】:

我相信你的目标如下。

  • 根据您的回复,

    我的意思是行。例如,我只选择了 TEXT_EQ 值为“Open”的行,我想获取某个列中所有值为“Open”的行。现在清楚了吗,还是我需要详细说明?

  • 您想从过滤后的工作表中检索显示的行。

  • 您正在使用 googleapis for python,并且您已经能够使用 Sheets API 获取和放置 Google 电子表格的值。

  • 来自I don't want to run for loop on fetched data.,您希望通过使用脚本过滤来实现此目的,而无需从所有数据中检索。您只想通过一个 API 调用来实现这一目标。

在这种情况下,我想建议使用查询语言来实现您的目标。使用查询语言时,可以直接调用显示行。示例脚本如下。

示例脚本:

在使用此脚本之前,请设置电子表格 ID 和工作表 ID。并且,此示例脚本使用 credsservice = build('sheets', 'v4', credentials=creds) 来检索访问令牌。所以请附上你的授权脚本。

# In this sample script, the access token is retrieved from "creds".
# service = build('sheets', 'v4', credentials=creds)

spreadsheet_id = "###" # Please set the Spreadsheet ID.
sheet_id = "0"  # Please set the sheet name.

url = 'https://docs.google.com/spreadsheets/d/' + spreadsheet_id + '/gviz/tq?tqx=out:csv&gid=' + str(sheet_id)
res = requests.get(url, headers={'Authorization': 'Bearer ' + creds.token})
ar = [row for row in csv.reader(io.StringIO(res.text), delimiter=',')]
# ar.pop(0) # When you want to remove the header row, you can also use this.
print(ar)
  • 在此示例中,还使用了import csvimport ioimport requests

参考:

【讨论】:

  • 这太棒了。这正是我想要的
  • @Mike Patel 感谢您的回复和测试。我很高兴你的问题得到了解决。也谢谢你。
  • 我想对这些检索到的行执行某些操作,然后只更新这些行,所以,是否也可以获取相应的范围,这只返回行,但我也想要相应的范围。
  • @Mike Patel 关于您的新问题,在这种情况下,查询语言无法直接检索行号。所以起初,我询问了检索到的值。在这种情况下,作为一种解决方法,如何添加包含行号的列?这样,检索到的值包括行号。由此,可以检索范围。如果这不是您期望的方向,我很抱歉。
  • 是的,添加行号已经是我脑海中的一个解决方案,但我认为这是现在实现这一目标的唯一可能方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多