[英]Escaping text wih google spreadsheet api
我正在使用谷歌电子表格 api 来更新几个电子表格中的数据,我需要转义一些文本才能在以下公式中使用它们:
=IFNA(FILTER('Another_SheetName'!B:B, 'Another_SheetName'!A:A=92433), HYPERLINK(url, "some_text"))
其中Another_SheetName
是我使用电子表格 api 获得的另一张工作表的名称,而some_text
是我想要放置的文本,我有以下两个问题:
some_text
有双引号( "
),我会收到一个公式解析错误。我可以解决这个问题,将some_text
放在单元格 A1 中,然后将公式更改为=HYPERLINK(url, A1)
,但我想知道是否有一般的方法来转义文本some_text
以在公式中使用它,这样就不必使用其他单元格。Another_SheetName
可以有一个单引号 ( '
),我会得到一个未解决的工作表名称。 我可以每次在Another_SheetName
中修复这个替换'
by ''
,但是我需要考虑另一种情况? 或者有一种方法可以对文本Another_SheetName
进行转义,以便在=FILTER('Another_SheetName'!B:B, 'Another_SheetName'!A:A=92433)
类的公式中使用它?这是一个例子。
我使用以下代码更新工作表:
c = '''=IFNA(FILTER('Another' SheetName'!B:B, 'Another' SheetName'!A:A=92433), HYPERLINK(url, "some" text"))'''
batch_request = {'requests': [
{'updateCells': {
'start': {'sheetId': sheetId, 'rowIndex': i, 'columnIndex': i},
'rows': [
{'values': [{'userEnteredValue': {'numberValue': 1}}, {'userEnteredValue': {'stringValue': 'asd'}}]},
{'values': [{'userEnteredValue': {'formulaValue': c}}, {'userEnteredValue': {'formulaValue': c}}]}
],
'fields': 'userEnteredValue'
}}
]}
serviceSheet = googleapiclient.discovery.build('sheets', 'v4', credentials=credentials)
serviceSheet.spreadsheets().batchUpdate(spreadsheetId=spreadsheetId, body=batch_request).execute()
谢谢您的帮助!!
更新
我决定用一个更简单的例子来详细说明第一个问题中的问题。 问题是我有一个带有双引号 ( "
) 的文本,如果我使用下面的代码,我会得到一个Formula parsing error
。
url = 'https://stackoverflow.com/'
some_text = 'some "text'
c = f'=HYPERLINK("{url}", "{some_text}")'
batch_request = {'requests': [
{'updateCells': {
'start': {'sheetId': sheetId, 'rowIndex': 0, 'columnIndex': 0},
'rows': [
{'values': [{'userEnteredValue': {'formulaValue': c}}]}
],
'fields': 'userEnteredValue'
}}
]}
serviceSheet = googleapiclient.discovery.build('sheets', 'v4', credentials=credentials)
serviceSheet.spreadsheets().batchUpdate(spreadsheetId=spreadsheetId, body=batch_request).execute()
我发现解决这个问题的方法是将some_text
的内容插入给定单元格中,例如A1
,然后在上面的公式中引用它。 像这样的东西:
url = 'https://stackoverflow.com/'
some_text = 'some "text'
c = f'=HYPERLINK("{url}", A1)'
batch_request = {'requests': [
{'updateCells': {
'start': {'sheetId': sheetId, 'rowIndex': 0, 'columnIndex': 0},
'rows': [
{'values': [{'userEnteredValue': {'stringValue': some_text}}, {'userEnteredValue': {'formulaValue': c}}]},
],
'fields': 'userEnteredValue'
}}
]}
serviceSheet = googleapiclient.discovery.build('sheets', 'v4', credentials=credentials)
serviceSheet.spreadsheets().batchUpdate(spreadsheetId=spreadsheetId, body=batch_request).execute()
但是有一种方法可以在不使用另一个单元格的情况下解决这个问题吗?
我相信你的目标如下。
Another_SheetName
用作工作表名称。 但是从您的显示脚本中,使用了Another' SheetName
。 另外,从If Another_SheetName can have a single quote (') I get an Unsolved Sheet Name.
,我认为您的工作表名称可能包含单引号。 例如,当='Another_SheetName'!B:B
放入单元格时,似乎单引号被自动删除。 例如,当='Another SheetName'!B:B
放在单元格中时,似乎没有删除单引号。 手动放置和通过 Sheets API 放置都会出现这种情况。
并且,例如,当使用='Another' SheetName'!B:B
时,就会出现引用错误。 在这种情况下,它必须是='Another'' SheetName'!A1
。
从这些结果来看,下面的修改怎么样?
c = '''=IFNA(FILTER('Another' SheetName'!B:B, 'Another' SheetName'!A:A=92433), HYPERLINK(url, "some" text"))'''
在这种情况下,将'
替换为''
并使用它。 运行此脚本时, =IFNA(FILTER('Another'' SheetName'!B:B, 'Another'' SheetName'!A:A=92433), HYPERLINK("https://stackoverflow.com", "some_text"))
被放到一个单元格中。
url = "https://stackoverflow.com" sheetName = "Another' SheetName" sheetName = sheetName.replace("'", "''") c = f"=IFNA(FILTER('{sheetName}'!B:B, '{sheetName}'!A:A=92433), HYPERLINK(\"{url}\", \"some_text\"))"
在这种情况下,使用INDIRECT
。 运行此脚本时, =IFNA(FILTER(INDIRECT("'Another' SheetName'!B:B"), INDIRECT("'Another' SheetName'!A:A")=92433), HYPERLINK("https://stackoverflow.com", "some_text"))
被放到一个单元格中。
url = "https://stackoverflow.com" sheetName = "Another' SheetName" c = f'=IFNA(FILTER(INDIRECT("\'{sheetName}\'!B:B"), INDIRECT("\'{sheetName}\'!A:A")=92433), HYPERLINK("{url}", "some_text"))'
关于您更新的问题,
当您想使用以下脚本时,
some_text = 'some "text'
c = f'=HYPERLINK("{url}", "{some_text}")'
下面的修改呢?
some_text = 'some "text'.replace('"', '""')
c = f'=HYPERLINK("{url}", "{some_text}")'
在本次修改中,将"
替换为""
,这样可以使用some "text
的文本。
顺便说一句,关于您的以下第二个脚本,公式被放在单元格“A1”中。 但是,该公式使用单元格“A1”的值。 在这种情况下,公式不起作用。 请注意这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.