在最后一行之前添加值行并保留最后一行格式

Add rows of values before last row and preserve last row format

我是 Google 表格的新手 API 所以请多多包涵。
我有一个用作模板的电子表格,最后两行以某种特定方式(颜色和字体)格式化。

看起来像这样:

| header 1     | header 2     | header 3     |
| placeholder1 | placeholder2 | placeholder3 |
| color footer1|color footer2 | color footer2|

我想要做的是根据需要插入尽可能多的 "placeholder" 行,并让最后一行 'slide' 向下。

到目前为止,我尝试了 values.update,它会插入新行,但不会向下移动最后一行的颜色。所以我最终得到了我想要的电子表格中的数据,但是颜色格式错误(基本上第三行总是有彩色背景,而最后一行没有)。

我想做的伪代码:

  1. 计算我需要添加多少个占位符行,
  2. 获取电子表格
  3. 将最后两行剪切并粘贴到新位置
  4. 获取电子表格的值
  5. 更新值(替换占位符、插入新行、更新总计)

我不确定这是最好的方法(似乎有点复杂)。谁能给我指出正确的方向?

您可以应用条件格式,而不是将格式应用于单元格,并让它始终匹配最终单元格的数据。

例如,根据 this link,您可以将以下条件格式应用于 A2:Z999

,从而始终应用于最后一行

=Arrayformula(Row($A2:$A) = Max((Row($A2:$A))*(($A2:$A<>""))))

或者有一些数据总是只出现在最后一行,并且基于它匹配该数据的格式。

但是,请注意,如果您要创建全新的行,条件格式可能会超过 Z 行,在这种情况下,您的条件格式将不再适用(无需手动更新它适用的行,扩展它的范围)。根据您的需要,这可能会限制此方法的可用性。

所以最后我决定使用spreadsheet.get来检索模板。

我将标志 includeGridData 设置为 true,这会发回每个单元格的所有信息。

这是一个很大的东西,但它有我需要的一切。

然后我克隆模板行,根据需要生成尽可能多的副本。

最后,我将这些新行放回 get 返回的行对象中(没有模板行),然后使用 batchUpdate 更新电子表格。

像这样:

async updateSpreadsheetCells(clone, data, spreadSheetDataRows) {
  const request = {
    spreadsheetId: clone.id,
    resource: {
      requests: [
        {
          updateCells: {
            fields: '*',
            range: {
              sheetId: 0,
              startRowIndex: 0,
              endRowIndex: endRow // value dynamically calculated
              startColumnIndex: 0,
              endColumnIndex: this.endColumnIndex
            },
            rows: spreadSheetDataRows //this will replace all the rows
          }
        }
      ]
    }
  };
  await this.googleSheetService.batchUpdateSpreadSheet(request);
}

这是一个快速概览,代码有点复杂,这里 post 没有意义。希望这会对其他人有所帮助。