使用 google 电子表格 API 仅删除单元格范围选择的格式

Posted

技术标签:

【中文标题】使用 google 电子表格 API 仅删除单元格范围选择的格式【英文标题】:Remove only formatting on a cell range selection with google spreadsheet API 【发布时间】:2018-01-29 18:38:24 【问题描述】:

我正在寻找一种方法,使用带有 python 的 Google sheet API 仅删除单元格范围选择的格式,而不是其内容。

目前,我唯一的解决方案是应用与普通格式相同的逻辑并将样式设置为 NONE。例如,当我将边框格式设置为特定范围时,我使用:

    request_dict = 'requests': [
                    "updateBorders": 
                      "range": 
                        "sheetId": sheetId,
                        "startRowIndex": 1,
                        "endRowIndex": raws,
                        "startColumnIndex": first_col,
                        "endColumnIndex": last_col,
                      "top": 
                        "style": "SOLID_MEDIUM",
                        "width": 1,
                        "color": "blue": 0,
                      "bottom": 
                        "style": "SOLID_MEDIUM",
                        "width": 1,
                        "color": "blue": 0,
                      "left": 
                        "style": "SOLID_MEDIUM",
                        "width": 1,
                        "color": "blue": 0,
                      "right": 
                        "style": "SOLID_MEDIUM",
                        "width": 1,
                        "color": "blue": 0,
                      "innerHorizontal": 
                        "style": "SOLID_MEDIUM",
                        "width": 1,
                        "color": "blue": 0,
                      "innerVertical": 
                        "style": "SOLID_MEDIUM",
                        "width": 1,
                        "color": "blue": 0]
body = 'requests': request_dict['requests']
service.spreadsheets().batchUpdate(spreadsheetId=spreadsheetId,
                                   body=body).execute()

如果我想删除它,我将“样式”字段替换为“NONE”,如下所示:

    request_dict = 'requests': [
                    "updateBorders": 
                      "range": 
                        "sheetId": sheetId,
                        "startRowIndex": 1,
                        "endRowIndex": raws,
                        "startColumnIndex": first_col,
                        "endColumnIndex": last_col,
                      "top": 
                        "style": "NONE",
                        "width": 1,
                        "color": "blue": 0,
                      "bottom": 
                        "style": "NONE",
                        "width": 1,
                        "color": "blue": 0,
                      "left": 
                        "style": "NONE",
                        "width": 1,
                        "color": "blue": 0,
                      "right": 
                        "style": "NONE",
                        "width": 1,
                        "color": "blue": 0,
                      "innerHorizontal": 
                        "style": "NONE",
                        "width": 1,
                        "color": "blue": 0,
                      "innerVertical": 
                        "style": "NONE",
                        "width": 1,
                        "color": "blue": 0]
body = 'requests': request_dict['requests']
service.spreadsheets().batchUpdate(spreadsheetId=spreadsheetId,
                                   body=body).execute()

但这意味着我需要为我定义的每种格式定义一个擦除格式的函数,这不是很实用... 第一步是找到一种方法来擦除整个工作表上的格式,也许之后才能对我工作表中的特定范围执行此操作。

【问题讨论】:

我不知道......但也许你可以从一个已知的、未格式化的单元格中复制格式。 【参考方案1】:

我知道这是旧的,可​​能指的是 v3,但我想我会添加对我有用的内容:


repeatCell: 
    range: 
        sheetId: sheetId,
        startRowIndex: 0,
        endRowIndex: <rows>,
        startColumnIndex: 0,
        endColumnIndex: <columns>
    ,
    fields: "userEnteredFormat"

【讨论】:

【参考方案2】:

有同样的问题并想通了。另一个答案很接近,但对于任何偶然发现这一点的人来说。在api samples 中,它们表明您可以使用updateCells 来清除采用gridRange 参数的格式。 gridRange 文档说

缺少索引表示该边的范围是无限的。

因此去掉所有索引以影响整个工作表。

清除整个工作表:

body = 
    "requests": [
        
            "updateCells": 
                "range": 
                    "sheetId": sheetId
                ,
                "fields": "userEnteredFormat"
            
        
    ]

spreadsheet.batch_update(body)

清除范围:

body = 
    "requests": [
        
            "updateCells": 
                "range": 
                    "sheetId": sheetId,
                    "startRowIndex": 1,
                    "endRowIndex": raws,
                    "startColumnIndex": first_col,
                    "endColumnIndex": last_col
                ,
                "fields": "userEnteredFormat"
            
        
    ]

spreadsheet.batch_update(body)

【讨论】:

【参考方案3】:

This documentation 似乎声明如果您在updateCells 请求中将fields 设置为"userEnteredValue",它将删除所有格式。我还没有对此进行测试,但你去吧:

request_dict = 
    "requests": [
        "updateCells": 
              "range": 
                  "sheetId": sheetId,
                  "startRowIndex": 1,
                  "endRowIndex": raws,
                  "startColumnIndex": first_col,
                  "endColumnIndex": last_col
             ,
             "fields": "userEnteredValue"
         
     ]

【讨论】:

我有一个编辑似乎表明userEnteredValue 应该是userEnteredFormat 而不是......这是有道理的,但我再次没有测试它。如果有人在这里测试它和 cmets,我会更新我的答案。 我为此使用fields: 'userEnteredFormat',但使用repeatCell 而不是updateCells 命令

以上是关于使用 google 电子表格 API 仅删除单元格范围选择的格式的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Google 电子表格 API 在单元格中添加评论?

Google 表格脚本 - 根据单元格作为今天的日期发送电子邮件

Google 电子表格在消耗 400000 个单元格之前停止存储数据

Google 电子表格脚本:检查单元格是不是为空

为当前单元格设置默认值 Google 电子表格

如何在 Google 电子表格的 WHERE 子句 QUERY 中使用一系列单元格