Скрипты и триггеры из 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 шт):

Автор решения: oshliaer

Нажимая кнопку у себя в приложении, вы не вызываете триггер события Edit. Т.е. этого сделать невозможно.

Вы можете попробовать установить триггер события Change, узнать диапазон изменения, и отталкиваться от этого в своем скрипте.

→ Ссылка