Golang筛选Google Sheet空白C列行并实现批量更新
问题描述
我有一个包含A、B、C三列的Google Sheet,数据如下:
A B C 0 1 2 3 1 4 5 6 2 7 8 3 9 10 4 11 12
需要从第2行开始,筛选出C列值为空的行并获取其行索引。目前已编写了如下读取数据的Golang代码:
readRange := "Sheet1!A:C" resp1, err := srv.Spreadsheets.Values.Get(spreadsheetId, readRange).Do() if err != nil { log.Fatalf("Unable to retrieve data from sheet: %v", err) } if len(resp1.Values) == 0 { fmt.Println("No data found.") } else { for _, row := range resp1.Values { fmt.Printf("%s, %s\n", row[0], row[1]) } }
请问如何在这段代码中添加筛选逻辑,以及后续如何更新这些空白的C列单元格?
解决方案
一、添加筛选逻辑获取空C列的行索引
Google Sheets的行号是1起始,而resp1.Values返回的切片是0起始,因此实际行号需要用切片索引加1计算。要从Sheet第2行(对应切片索引1)开始筛选,修改原代码如下:
readRange := "Sheet1!A:C" resp1, err := srv.Spreadsheets.Values.Get(spreadsheetId, readRange).Do() if err != nil { log.Fatalf("Unable to retrieve data from sheet: %v", err) } if len(resp1.Values) == 0 { fmt.Println("No data found.") } else { // 存储需要更新的Sheet实际行号 var emptyCRows []int for idx, row := range resp1.Values { // 跳过Sheet第1行(切片索引0) if idx < 1 { continue } // 判断C列为空:要么行数据长度不足3(无C列值),要么第3个元素为空字符串 cColEmpty := len(row) < 3 || row[2] == "" if cColEmpty { sheetRowNum := idx + 1 emptyCRows = append(emptyCRows, sheetRowNum) fmt.Printf("C列空白行:Sheet行号%d,A值%s,B值%s\n", sheetRowNum, row[0], row[1]) } } // 后续可使用emptyCRows执行更新操作 }
二、更新空白的C列单元格
使用Google Sheets API的Values.Update方法更新单元格,推荐批量合并连续行的范围以减少API调用次数,示例如下:
1. 单条更新(适合少量行)
// 假设给空白C列填充"已补全",可替换为需要的值 for _, rowNum := range emptyCRows { rangeStr := fmt.Sprintf("Sheet1!C%d", rowNum) _, err := srv.Spreadsheets.Values.Update( spreadsheetId, rangeStr, &sheets.ValueRange{Values: [][]interface{}{{"已补全"}}}, ).ValueInputOption("RAW").Do() // RAW表示直接写入值,不解析公式 if err != nil { log.Printf("更新行%d失败:%v", rowNum, err) } else { fmt.Printf("成功更新行%d的C列\n", rowNum) } }
2. 批量更新(高效处理多行)
合并连续行的范围,减少API调用次数:
if len(emptyCRows) == 0 { fmt.Println("没有需要更新的C列空白行") return } // 按顺序遍历合并连续行(emptyCRows默认是升序) startRow := emptyCRows[0] endRow := emptyCRows[0] var batchValues [][]interface{} batchValues = append(batchValues, []interface{}{"已补全"}) for i := 1; i < len(emptyCRows); i++ { if emptyCRows[i] == endRow + 1 { endRow = emptyCRows[i] batchValues = append(batchValues, []interface{}{"已补全"}) } else { // 提交当前批次 rangeStr := fmt.Sprintf("Sheet1!C%d:C%d", startRow, endRow) _, err := srv.Spreadsheets.Values.Update( spreadsheetId, rangeStr, &sheets.ValueRange{Values: batchValues}, ).ValueInputOption("RAW").Do() if err != nil { log.Printf("更新范围%s失败:%v", rangeStr, err) } else { fmt.Printf("成功更新范围%s\n", rangeStr) } // 重置批次 startRow = emptyCRows[i] endRow = emptyCRows[i] batchValues = [][]interface{}{{"已补全"}} } } // 提交最后一个批次 rangeStr := fmt.Sprintf("Sheet1!C%d:C%d", startRow, endRow) _, err := srv.Spreadsheets.Values.Update( spreadsheetId, rangeStr, &sheets.ValueRange{Values: batchValues}, ).ValueInputOption("RAW").Do() if err != nil { log.Printf("更新范围%s失败:%v", rangeStr, err) } else { fmt.Printf("成功更新范围%s\n", rangeStr) }
内容的提问来源于stack exchange,提问作者aakash singh
相关产品推荐
相关产品推荐

