insertAll method

Future<List<int>> insertAll(
  1. List<Map<String, dynamic>> dataList
)

Insere múltiplos registros com auto-incremento de ID

Implementation

Future<List<int>> insertAll(List<Map<String, dynamic>> dataList) async {
  if (dataList.isEmpty) return [];

  final rows = await getRawRows();
  if (rows.isEmpty) throw Exception("Cabeçalhos não encontrados.");

  final headers = List<String>.from(rows[0]);
  int idColIndex = headers.indexOf("id");
  if (idColIndex == -1) throw Exception("Coluna 'id' não encontrada.");

  int maxId = 0;
  for (var i = 1; i < rows.length; i++) {
    if (rows[i].length > idColIndex) {
      var currentIdValue = rows[i][idColIndex].toString();
      if (currentIdValue.isNotEmpty) {
        int? currentId = int.tryParse(currentIdValue);
        if (currentId != null && currentId > maxId) {
          maxId = currentId;
        }
      }
    }
  }

  List<List<Object?>> newRows = [];
  List<int> newIds = [];
  int nextId = maxId + 1;

  for (var data in dataList) {
    final newRow = headers.map((h) {
      if (h == "id") {
        return nextId;
      }
      return data[h];
    }).toList();

    newRows.add(List.from(newRow));
    newIds.add(nextId);
    nextId++;
  }

  await api.spreadsheets.values.append(
    sheets.ValueRange(values: newRows),
    spreadsheetId,
    '$sheetName!A1',
    valueInputOption: "USER_ENTERED",
  );

  _cachedRawRows = null; // Invalida o cache
  return newIds;
}