Скрипты и триггеры из App Script Google Sheet не запускается, когда лист редактируется service account в Flutter приложении
Вообщем и кратко: Пишу приложение на Flutter, бэк на Google Sheets Мне нужно, чтобы при появлении строки в Google Sheets на рабочем листе в только что появившейся строке на колонке номер, например, 15 появился "Флажок"(CheckBox). Проблема заключается в том, если я внесу простое изменение в таблицу (сам ручками, через свой акк Google), то все работает как надо, но, если я нажму в своем приложении на кнопку, что отправляет изменения в таблицу (добавление строки), то строка добавляется корректно, а вот "Флажок" уже не появляется в этом проклятом 15 столбце :( Думал, что проблема заключается в том, что параметр ValueInputOption не равен userEntered и поэтому то и не реагировал на изменения в таблице, но я узнал, что он сразу равен userEntered (при создании Spreadsheet в коде Flutter'а) .
Уже все проресерчил, чат гпт что-то не справляется(возможно я не так его спрашиваю)
Вот код триггера с App Script:
// Добавление чекбокса в столбец номер 16, там, где написано "Заказ готов?"
function onEditAddCheckBox(e) {
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
let row = e.range.getRow();
let column = e.range.getColumn();
let value = e.source.getActiveSheet().getRange(row, 1).getValue();
let checkbox = SpreadsheetApp.newDataValidation().requireCheckbox().setAllowInvalid(false).build();
if (column == 1 && value !== "") {
sheet.getRange(row, 15).setDataValidation(checkbox).setValue(false);
}
}
// Функция для создания триггера к onEditAddCheckBox
function createOnEditTriggerCheckBox() {
// Получаем активный лист
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// Создаем триггер, который будет вызывать функцию onEditAddCheckBox при редактировании листа
ScriptApp.newTrigger("onEditAddCheckBox")
.forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet())
.onEdit()
.create();
}
А вот код из Flutter:
import 'package:coffee_app/services/google_sheets_api.dart';
import 'package:coffee_app/services/google_sheets_config.dart';
import 'package:gsheets/gsheets.dart';
/// Сервис инкапсулирует всю логику работы с Google Sheets
/// и предоставляет методы для использования этих данных в других частях приложения.
class GoogleSheetsService {
//// Обьявление таблицы и рабочего листа
/// Сама электронная таблица
final _gsheets = GSheets(GoogleSheetsConfig.credentials);
final _spreadsheetId = GoogleSheetsConfig.spreadSheetId;
/// Словарь - все рабочие листы из Google Sheets
Map<String, GoogleSheetsApi> _worksheets = {};
/// Метод: инициализация рабочих листов по название:сам лист
Future<void> initGoogleSheets() async {
final spreadsheet = await _gsheets.spreadsheet(_spreadsheetId, input: ValueInputOption.userEntered, render: ValueRenderOption.formattedValue);
List<Worksheet?> allWorksheets = await spreadsheet.sheets;
//spreadsheet.values.update
for (final worksheet in allWorksheets) {
if (worksheet != null) {
_worksheets[worksheet.title] = GoogleSheetsApi(worksheet);
}
}
}
/// Метод: получение определенного рабочего листа по названию
GoogleSheetsApi? getWorksheet(String title) {
return _worksheets[title];
}
}
import 'package:coffee_app/models/cart_item.dart';
import 'package:coffee_app/models/food.dart';
import 'package:gsheets/gsheets.dart';
/// Класс для работы с определенным рабочим листом Google Sheets
class GoogleSheetsApi {
/// Сам рабочий лист этой таблицы
final Worksheet _worksheet;
GoogleSheetsApi(this._worksheet);
// ГЕТТЕРЫ
/// Геттер для рабочего листа
Worksheet get worksheet {
return _worksheet;
}
/// Метод: Получить все строки рабочего листа таблицы.
Future<List<List<dynamic>>> getRows() async {
try {
return await _worksheet.values.allRows();
} catch (e) {
print('Error retrieving rows from Google Sheets: $e');
rethrow;
}
}
/// Метод: Получить номер последней занятой строки в листе по его названию
Future<int> getLastUsedRow() async {
// Получение информации о диапазоне используемых ячеек
var gridRange;
try {
gridRange = await getRows();
int lastUsedRow = gridRange.length;
return lastUsedRow;
} catch (e) {
print('Произошла ошибка при получении номера последней строки: $e');
rethrow;
}
}
/// Метод: Добавить строку
Future<void> appendRow(List<dynamic> row) async {
try {
await _worksheet.values.appendRow(row);
//_worksheet.values
//print(_worksheet.inputOption.toString()); тут говорит, что UESERENTERED
} catch (e) {
print('Произошла ошибка при добавлении строки в Google Sheets: $e');
rethrow;
}
}
// Методы с определенными рабочими листами Google Sheets
/// Метод: Пакетное обновление информации о заказе
Future<void> updateInfoAboutOrder(CartItem cartItem) async {
// Получаем номер клиента
int orderNum = await getLastUsedRow();
// Разбиваем список на строку
String tempAllAddons = '';
for (Addon addon in cartItem.addons) {
tempAllAddons = tempAllAddons + addon.name + '; ';
}
// Строка для добавление в рабочий лист
List<dynamic> rowToUpdate = [
orderNum,
'Client Name',
cartItem.food.name,
cartItem.coffeeMixture,
tempAllAddons,
cartItem.syrup,
cartItem.sprinkles,
cartItem.sugar,
cartItem.foodSize,
cartItem.totalPrice,
];
// Добавляем заказ в электронную таблицу
await appendRow(rowToUpdate);
print('Updated information for Client # $orderNum');
bool isOrderReady = false; // Заказ не готов к выдаче
var myCell = await _worksheet.cells.cell(row: orderNum+1, column: 13);
myCell.post(isOrderReady);
// _worksheet.values
// .insertValueByKeys(isOrderReady, columnKey: 13, rowKey: orderNum);
}
}
Файл google_sheets_config.dart содержит данные для подключения моей GoogleSheet к приложению. Использую для этого всего библиотеку gsheets.dart Уже не знаю что делать, впервые тут пишу(
Цитата
Ответы (1 шт):
Нажимая кнопку у себя в приложении, вы не вызываете триггер события Edit. Т.е. этого сделать невозможно.
Вы можете попробовать установить триггер события Change, узнать диапазон изменения, и отталкиваться от этого в своем скрипте.