delete method
Deleta fisicamente a linha baseada no ID
Implementation
Future<void> delete(String id) async {
final rows = await getRawRows(forceRefresh: true);
if (rows.isEmpty) return;
int rowIndex = rows.indexWhere(
(row) => row.isNotEmpty && row[0].toString() == id,
);
if (rowIndex == -1) return;
final gid = await getGid();
// Pega os índices da cascata
final cascadeIndices = await GoogleSheetsDatabase()
.buildCascadeDeleteIndices(sheetName, [id]);
// Adiciona o próprio índice
cascadeIndices.putIfAbsent(gid, () => {}).add(rowIndex);
// Constrói os requests garantindo unicidade e ordem decrescente
final List<sheets.Request> requests = [];
cascadeIndices.forEach((sheetId, indices) {
final sortedIndices = indices.toList()..sort((a, b) => b.compareTo(a));
for (final index in sortedIndices) {
requests.add(
sheets.Request(
deleteDimension: sheets.DeleteDimensionRequest(
range: sheets.DimensionRange(
sheetId: sheetId,
dimension: "ROWS",
startIndex: index,
endIndex: index + 1,
),
),
),
);
}
});
await api.spreadsheets.batchUpdate(
sheets.BatchUpdateSpreadsheetRequest(requests: requests),
spreadsheetId,
);
// Como a deleção pode ter apagado a linha 2 (que contém as fórmulas ARRAYFORMULA),
// nós reaplicamos as fórmulas para garantir que a planilha continue funcionando.
await GoogleSheetsDatabase().reapplyFormulas();
_cachedRawRows = null; // Invalida o cache local
}