从单元格中检索多个字体数据

Posted

技术标签:

【中文标题】从单元格中检索多个字体数据【英文标题】:Retrieve multiple fonts data from within a cell 【发布时间】:2020-10-29 16:46:40 【问题描述】:

Google 表格中的单元格可以在其中存储的字符串中包含多种字体颜色(或其他富文本属性)。

也可以通过属性TextFormatRun 使用API​​ 来完成,例如explained here。

但是,只有关于写作部分的讨论,我在 API 文档或在线外部资源中没有任何地方提及阅读和检索这些富文本数据。

这可以实现吗?

例如,我想检索这样一个单元格的完整字体颜色数据:

PS:我正在使用 python,如果这相关的话。

【问题讨论】:

现在,我注意到您的问题已更新。我对此深表歉意。从您更新的问题中,我添加了一个 python 示例脚本。 【参考方案1】:

我相信你的目标如下。

您想使用 Sheets API 从电子表格中检索富文本数据。

在这种情况下,我认为使用“spreadsheets.get”的方法可以实现您的目标。但是当你使用它时,请设置字段。这样就可以检索富文本数据了。

端点:

https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId?ranges=Sheet1!A1&fields=sheets
此端点使用sheets 作为fields。此外,可以使用sheets(data(rowData(values(textFormatRuns))))。并且该值是从“Sheet1”中的“A1”单元格中检索的。 在这种情况下,没有进行 URL 编码。所以当你使用这个时,请对查询参数进行 URL 编码。

curl 命令示例:

curl \
  'https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId?ranges=Sheet1!A1&fields=sheets' \
  --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
  --header 'Accept: application/json' \
  --compressed
在此示例 curl 中,使用了访问令牌。

样本值:

当从上面带有sheets(data(rowData(values(textFormatRuns))))字段的单元格中检索富文本的数据时,得到如下值。


  "sheets": [
    
      "data": [
        
          "rowData": [
            
              "values": [
                
                  "textFormatRuns": [
                    
                      "format": 
                        "foregroundColor": 
                          "red": 1
                        ,
                        "bold": true,
                        "foregroundColorStyle": 
                          "rgbColor": 
                            "red": 1
                          
                        
                      
                    ,
                    
                      "startIndex": 1,
                      "format": 
                        "fontSize": 18
                      
                    ,
                    
                      "startIndex": 5,
                      "format": 
                        "foregroundColor": 
                          "red": 1
                        ,
                        "italic": true,
                        "foregroundColorStyle": 
                          "rgbColor": 
                            "red": 1
                          
                        
                      
                    ,
                    
                      "startIndex": 6,
                      "format": 
                    ,
                    
                      "startIndex": 7,
                      "format": 
                        "foregroundColor": 
                          "blue": 1
                        ,
                        "bold": true,
                        "italic": true,
                        "foregroundColorStyle": 
                          "rgbColor": 
                            "blue": 1
                          
                        
                      
                    
                  ]
                
              ]
            
          ]
        
      ]
    
  ]

Google Apps 脚本:

当使用 Google Apps Script 时,示例脚本如下。

const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
const richTextValue = sheet.getRange("A1").getRichTextValue();
const res = richTextValue.getRuns().map(r => (
  text: r.getText(),
  foregroundColor: r.getTextStyle().getForegroundColor(),
  fontSize: r.getTextStyle().getFontSize(),
  bold: r.getTextStyle().isBold(),
  italic: r.getTextStyle().isItalic()
));
console.log(res)
使用getRichTextValue()。当您想从多个单元格中检索富文本的数据时,您也可以使用getRichTextValues()。 结果:

使用上述单元格时,返回以下值。

[
  
    "text": "s",
    "foregroundColor": "#ff0000",
    "fontSize": 36,
    "bold": true,
    "italic": false
  ,
  
    "text": "ampl",
    "foregroundColor": "#000000",
    "fontSize": 18,
    "bold": false,
    "italic": false
  ,
  
    "text": "e",
    "foregroundColor": "#ff0000",
    "fontSize": 36,
    "bold": false,
    "italic": true
  ,
  
    "text": " ",
    "foregroundColor": "#000000",
    "fontSize": 36,
    "bold": false,
    "italic": false
  ,
  
    "text": "text",
    "foregroundColor": "#0000ff",
    "fontSize": 36,
    "bold": true,
    "italic": true
  
]

Python:

使用python脚本时,变成如下。响应值与 curl 命令相同。在这种情况下,您也可以在官方文档中看到示例脚本。 Ref

spreadsheet_id = '###' # Please set Spreadsheeet ID.
ranges = 'Sheet1!A1' # Please set range as a1Notation.
service = build('sheets', 'v4', credentials=creds)
fields = 'sheets(data(rowData(values(textFormatRuns))))'
res = service.spreadsheets().get(spreadsheetId=spreadsheet_id, ranges=ranges, fields=fields).execute()
print(res)

注意:

当您想使用Sheets API确认单元格中的文本数据时,例如可以使用userEnteredValueformattedValue

参考资料:

Method: spreadsheets.get 您也可以在“试用此 API”中进行测试。 getRichTextValue() getRichTextValues() Class RichTextValue

【讨论】:

你的回答太棒了!非常感谢这个广泛而深入全面的解释。我还没有回答,因为在你花了这么多时间帮助我之后,我想花必要的时间给你一个有价值的回应,并确保我自己在我自己的工作表上实现所有这些,看看我是否能做到正常工作。但是,当我看到你刚刚发表的评论时,我不得不快速回复告诉你我承认你的信息,这显然是要走的路。当我明天有时间时,我一定会更新你的。再次感谢:)

以上是关于从单元格中检索多个字体数据的主要内容,如果未能解决你的问题,请参考以下文章

从表格小部件中的选定单元格中检索单元格数据

如何使用 PhpSpreadsheet 从表格单元格中检索日期?

Open Office calc 的公式或宏,用于从单元格中检索注释(注释)

从多节 UITableView 中的自定义静态单元格中检索标签文本

在 Swift 中的自定义单元格中存储/检索核心数据

如何使用ruby中的电子表格gem从excel单元格中提取超链接地址?