根据我的理解,有两种方法可以将图像添加到Google表格中的单元格中。
=IMAGE
公式Insert > Image > Insert image in cell
我有一个包含图像的“数据库”表。维护起来很痛苦,所以我使用方法 1 将其自动化,但已经有大量使用方法 2。
问题:使用方法 2 时,Python(或者更具体地说,
gspread
)似乎无法检测到图像。这使得分离包含/不包含图像的单元变得不必要的困难。
问题:可以吗?如果是的话,怎么办?
提供的是最小的可重现示例
import gspread
gc = gspread.service_account(JSON_filePath)
spreadsheet = gc.open(sheet_name)
sheet = spreadsheet.worksheet("Images")
data = sheet.get_all_values()
for row in data:
print(row)
我添加了一个额外的行,其中包含公式:
=ARRAYFORMULA(if(ISBLANK(C2:C),TRUE,FALSE))
这将成功读取单元格是否包含图像。但是,如果可以避免的话,我不希望电子表格中出现此列。
下图显示了使用方法 2 的示例行。第一张图片是上述脚本的输出,第二张图片是相应的 Google Sheet 屏幕截图。
我认为在现阶段,
get_all_values()
的方法无法检测到细胞中图像的存在。但是,我猜想,当使用Sheets API的“方法:spreadsheets.get”时,也许可以实现这一点。
当这反映在示例脚本中时,它变成如下。
我注意到从您的显示脚本中,您正在使用 gspread。所以,在这个示例中,使用了gspread的客户端。
import gspread
from googleapiclient.discovery import build
client = gspread.service_account(JSON_filePath) # This client is from your showing script.
# Please set the Spreadsheet ID and the a1Notation of range.
spreadsheetId = "###"
a1Notation = "Sheet1!C1:C"
service = build("sheets", "v4", credentials=client.auth)
obj = service.spreadsheets().get(spreadsheetId=spreadsheetId, fields="sheets(data(rowMetadata,rowData(values(userEnteredValue))))", ranges=[a1Notation]).execute()
data = obj["sheets"][0]["data"][0]
res = []
lenRowData = len(data["rowData"])
lenRowMetadata = len(data["rowMetadata"])
for i in range(lenRowMetadata):
if lenRowData > i and "values" in data["rowData"][i]:
v = data["rowData"][i]["values"][0]
if "userEnteredValue" in v and len(v["userEnteredValue"].keys()) == 0:
res.append("Image")
continue
res.append("No image")
print(res)
例如,当图像放入您显示的示例电子表格中“Sheet1”的“C”列时,请使用
a1Notation = "Sheet1!C1:C"
。
作为示例结果,在显示的电子表格图像中,获得以下结果。假设第一个“无图像”是此示例结果中的第 1178 行。
[
,
,
,
"No image",
"Image",
"Image",
"Image",
"No image",
"No image",
"No image",
"Image",
"Image",
"No image",
"No image",
"Image",
"No image",
,
,
,
]