在最后一行之前添加值行并保留最后一行格式
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
,它会插入新行,但不会向下移动最后一行的颜色。所以我最终得到了我想要的电子表格中的数据,但是颜色格式错误(基本上第三行总是有彩色背景,而最后一行没有)。
我想做的伪代码:
- 计算我需要添加多少个占位符行,
- 获取电子表格
- 将最后两行剪切并粘贴到新位置
- 获取电子表格的值
- 更新值(替换占位符、插入新行、更新总计)
我不确定这是最好的方法(似乎有点复杂)。谁能给我指出正确的方向?
您可以应用条件格式,而不是将格式应用于单元格,并让它始终匹配最终单元格的数据。
例如,根据 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 没有意义。希望这会对其他人有所帮助。
我是 Google 表格的新手 API 所以请多多包涵。
我有一个用作模板的电子表格,最后两行以某种特定方式(颜色和字体)格式化。
看起来像这样:
| header 1 | header 2 | header 3 |
| placeholder1 | placeholder2 | placeholder3 |
| color footer1|color footer2 | color footer2|
我想要做的是根据需要插入尽可能多的 "placeholder" 行,并让最后一行 'slide' 向下。
到目前为止,我尝试了 values.update
,它会插入新行,但不会向下移动最后一行的颜色。所以我最终得到了我想要的电子表格中的数据,但是颜色格式错误(基本上第三行总是有彩色背景,而最后一行没有)。
我想做的伪代码:
- 计算我需要添加多少个占位符行,
- 获取电子表格
- 将最后两行剪切并粘贴到新位置
- 获取电子表格的值
- 更新值(替换占位符、插入新行、更新总计)
我不确定这是最好的方法(似乎有点复杂)。谁能给我指出正确的方向?
您可以应用条件格式,而不是将格式应用于单元格,并让它始终匹配最终单元格的数据。
例如,根据 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 没有意义。希望这会对其他人有所帮助。