insertRowByKey method
Updates row values with values from map
by column names.
Expands current sheet's size if inserting range is out of sheet's bounds.
The column A considered to be row names
map
- map containing values to insert (not null nor empty)
key
- name of a requested row (values of returned map)
fromColumn
- optional (defaults to 2), column index for the first inserted
value,
columns start at index 1 (column A)
mapTo
- optional, name of a column to which keys of the map
will be
mapped to, if mapTo
is null
then values will be mapped to column A
appendMissing
- whether keys of map
(with its related values) that
are not present in a mapTo
should be inserted into key
row
overwrite
- whether clear cells of key
row if map
does not
contain value for them
eager
- optional (defaults to true
), whether to add key
if absent
Returns Future true
in case of success.
Throws GSheetsException.
Implementation
Future<bool> insertRowByKey(
Object key,
Map<String, dynamic> map, {
int fromColumn = 2,
dynamic mapTo,
bool appendMissing = false,
bool overwrite = false,
bool eager = true,
}) async {
final rKey = parseKey(key);
final mKey = parseStringOrNull(mapTo);
checkIndex('fromColumn', fromColumn);
checkMapTo(rKey, mKey);
checkMap(map);
final rows = await _values.allRows();
final mapToIndex = mKey.isNullOrEmpty ? 0 : whereFirst(rows, mKey!);
if (mapToIndex < 0) return false;
var rowIndex = whereFirst(rows, rKey);
if (rowIndex < 0) {
if (!eager || rows.isEmpty || rows.first.isEmpty) return false;
rowIndex = rows.length;
await _values._ws._update(
values: [rKey],
range: await _values._ws._columnRange(1, rowIndex + 1, 1),
majorDimension: dimenColumns,
);
} else {
checkMapTo(rowIndex + 1, mapToIndex + 1);
}
final keys = get(rows, at: mapToIndex, or: <String>[])!;
return _insertRows(
rowIndex + 1,
[map],
keys,
fromColumn,
mapToIndex + 1,
appendMissing,
overwrite,
);
}