使用 google 电子表格 api 退出文本aping

Escaping text wih google spreadsheet api

我正在使用 google spreadsheet api 来更新多个 spreadsheet 中的数据,我需要转义一些文本才能在下面使用它们公式:

=IFNA(FILTER('Another_SheetName'!B:B, 'Another_SheetName'!A:A=92433), HYPERLINK(url, "some_text"))

其中 Another_SheetName 是另一个 sheet 的名称,我使用传播 sheet api 和 some_text 我想要的文本放,我有以下两个问题:

  1. 如果 some_text 有双引号 ("),我会收到公式解析错误。我可以解决这个问题,将 some_text 放入单元格 A1,然后将公式更改为 =HYPERLINK(url, A1),但我想知道是否有一种通用的方法来转义文本 some_text 以在公式,这样就不需要使用额外的单元格了。
  2. 如果 Another_SheetName 可以有单引号 (') 我得到一个未解决的 Sheet 名称。我可以在 Another_SheetName 中每次用 '' 替换 ' 来解决这个问题,但是我需要考虑另一种情况?或者有一种方法可以将文本 Another_SheetName 转义以在 =FILTER('Another_SheetName'!B:B, 'Another_SheetName'!A:A=92433)?
  3. 这样的公式中使用它

Here就是一个例子。

我用以下代码更新 sheet:

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://whosebug.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://whosebug.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 被用作 sheet 名称。但是从您的显示脚本中,使用了 Another' SheetName 。此外,根据 If Another_SheetName can have a single quote (') I get an Unsolved Sheet Name.,我认为您的 sheet 名称可能包含单引号。

例如,当='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://whosebug.com", "some_text")) 被放入单元格。

      url = "https://whosebug.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://whosebug.com", "some_text")) 被放入单元格。

      url = "https://whosebug.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”的值。在这种情况下,该公式不起作用。请注意这一点。