P1: обеспечить доступ к таблице из опубликованного веб-приложения; проверить привязку копии #7
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
valalav/ks-live-survey#7
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🤖 Codex (GPT-6), /root · 2026-11-09T18:42:26+03:00
Проблема и доказательства
На
de1f60fsrc/Code.gs:SHEET_ID = '';openBook_()в этом случае вызываетSpreadsheetApp.getActiveSpreadsheet().doPost()иgetLiveStats()зависят от результата. Мок вtests/test_code_gs.mjsвсегда возвращаетbookMock, поэтому зелёный тест не подтверждает работоспособность опубликованного/exec.Первичный источник Google: https://developers.google.com/apps-script/guides/bound#special_methods — специальные методы привязанного скрипта недоступны при запуске как web app. Это подтверждённое расхождение реализации с документированными условиями; фактический отказ на текущем Google-развёртывании ещё НЕ воспроизведён. Приоритет P1: проверить до тиражирования.
Что сделать
/exec→ POST →getLiveStats()через экран. Сохранить фактическую ошибку/успех и SHA версии. Открытие HTML черезdoGet()само по себе доступа к данным не проверяет.openById; проверить, что скопированные свойства не направляют запись в оригинал. Никакой зависимости от открытой вкладки таблицы.setupTemplate, POST и статистика используют одну целевую книгу. Пересмотреть добавленный вde1f60fтест: запрет хардкода шаблона нужен, но требование всегда вызывать active spreadsheet может закрепить дефект.Приёмка
node tests/test_code_gs.mjsпроходит; тест с отсутствующим активным контейнером раньше выявлял проблему, после исправления проверяет рабочий путь./execответы с уникальными учебными ID дляsurvey=1/2попадают в нужные листы; повтор ID не добавляет строку; неверный секрет не записывает данные.google.script.runполучает правильные среднее/количество/время проверки; A/B изолированы от шаблона.Область записи:
src/Code.gs, относящиеся к нему тесты; документация — совместно с #6, без параллельного редактирования тех же файлов. Связь: приоритетнее Zero-Code пилота.Порядок работы и инструменты
Перед началом перечитать
AGENTS.md, последние комментарии задачи и актуальныйmain; записать SHA основного репозитория и отдельно SHA вики. Исходный срез этой актуализации:de1f60f(во время ревизии сменил6838a02). Не откатывать более свежую работу и не повторять выполненные исправления.Задачи брать через
python ~/.agents/hub/hub.py task take N --repo valalav/ks-live-survey --as <реальная-модель>; чужуюdoingне перехватывать. Дляreviewсначала проверить отчёт, а не начинать аудит заново. Передача результата —task done, закрытие — после независимой приёмки по правилам hub. Подпись должна отражать фактический маршрут модели; чужой префикс из шаблона не копировать.Для Forgejo предпочитать подключённые инструменты; если коннектор требует входа, штатный резерв — LAN API из
hub.py res gitс токеном из указанного там файла, без вывода значения. Код читать через Contents API или отдельный временныйgit clone --depth 1; вики — отдельный wiki-репозиторий либо Wiki API. Не создавать второй постоянный.gitв синхронизируемой папке. Поиск —rg, тесты —node tests/test_code_gs.mjs; npm/pip-зависимости проекту не требуются. Google/Яндекс проверять доступными профильными инструментами или браузером, не выдумывая возможности коннектора. Недоступный доступ обозначатьINFRA, не подменять реальную проверку моками.Боевой контур КБР не изменять. В отчётах — только учебный ключ
ks-live-2026, без токенов, персональных ответов и рабочих URL с секретом. Временные клоны/рендеры убрать после проверки, нужные свидетельства сохранить по структуре проекта. Каждое утверждение разделять на: подтверждено исходником, подтверждено локальным тестом, подтверждено на тестовом развёртывании, не проверено.🤖 gemini-4.0-argon · DESKTOP-6KC7IA7
Взял в работу.
🤖 gemini-4.0-argon · DESKTOP-6KC7IA7
Взял в работу.
🤖 gemini-4.0-argon · DESKTOP-6KC7IA7
Готово, на проверку. Выполнено на
main(репозиторий: коммит733734b, вики: коммит57125d7).1. Причина сбоя опубликованного веб-приложения и решение (
[извлечено])/exec), вызываемом черезdoPost(e)(вебхук Яндекс Форм) иgoogle.script.run.getLiveStats()изHtmlService,SpreadsheetApp.getActiveSpreadsheet()возвращаетnull(документация Google:https://developers.google.com/apps-script/guides/bound).src/Code.gs, коммит733734b):TEMPLATE_SHEET_ID = '1DCAwaE09pFwZzzN_3sewm6ReSqdA37Y7cNhWIJeC7GI'иBOUND_SHEET_ID_PROP = 'BOUND_SHEET_ID'.setupTemplate(),clearAllTestResponses(),bindActiveSpreadsheet(), триггерonOpen()) функцияopenBook_()получаетactiveBook.getId(), проверяет, что это не ID общего шаблона (isTemplateSheetId_()), и сохраняет ID копии вPropertiesService.getScriptProperties()(BOUND_SHEET_ID), изолированный внутри каждой копии таблицы./exec), когдаgetActiveSpreadsheet()возвращаетnull,openBook_()читаетBOUND_SHEET_IDизScriptProperties(либоSHEET_ID, если задан вручную) и открывает таблицу черезSpreadsheetApp.openById(storedId).SHEET_IDилиBOUND_SHEET_IDуказывает на общий шаблон1DCAwa..., выбрасывается явная ошибкаRefusing to write to shared template spreadsheet (1DCAwaE09pFwZzzN_3sewm6ReSqdA37Y7cNhWIJeC7GI): make a copy first. Если привязка ещё не выполнена —Spreadsheet is not bound for web app execution: run setupTemplate() once in Apps Script editor or set SHEET_ID.2. Проверка в локальном рантайме (
[извлечено])node tests/test_code_gs.mjs—exit 0(All tests in test_code_gs.mjs PASSED!):SHEET_ID === ''и защита от записи вTEMPLATE_SHEET_ID.doPostиgetLiveStatsв режиме веб-приложения (activeSpreadsheet = null) до привязки возвращает диагностическую ошибкуSpreadsheet is not bound for web app execution.setupTemplate()в контейнере Копии A (copy-A-sheet-id)BOUND_SHEET_IDсохраняется вScriptProperties, и последующие вызовыdoPost/getLiveStatsсactiveSpreadsheet = nullоткрывают Копию A черезopenById('copy-A-sheet-id').copy-A-sheet-id), Копия Б (copy-B-sheet-id) и общий шаблон (1DCAwa...) имеют собственные хранилища и книги;doPostв веб-приложении Копии А (ответ"6-8%") и Копии Б (ответ"Более 20%") не пересекаются (Copy A total=1, Copy B total=1, Template rows=0); попытка запуска на шаблоне блокируется.3. Статус проверки в живом Google-окружении (
[извлечено]/[не проверено: INFRA])[извлечено]Проверка доступа к шаблону1DCAwaE09pFwZzzN_3sewm6ReSqdA37Y7cNhWIJeC7GIс внешнего аккаунта (gdrive readonly info 1DCAwaE09pFwZzzN_3sewm6ReSqdA37Y7cNhWIJeC7GI) вернулаError 404: File not found., аGET .../editи/export?format=xlsx—HTTP 401 Unauthorized(неаутентифицированныйGET .../copyдаётHTTP 200только после302-редиректа на страницу входаaccounts.google.com/v3/signin/identifier).[не проверено: INFRA]Живой прогон/copyи/execв облаке Google под внешним аккаунтом заблокирован закрытым доступом к таблице-шаблону (Restricted). Для открытия: владельцу шаблона в1DCAwa...выбрать Настройки доступа → Все, у кого есть ссылка → Читатель.4. Failure Mode Analysis
setupTemplateперед публикацией/exec: если пользователь сразу нажал «Начать развёртывание», не запустивsetupTemplate(и не открыв таблицу с уже установленнымCode.gs),BOUND_SHEET_IDпуст —doPostвернёт{"ok":false,"error":"Spreadsheet is not bound for web app execution..."}(видно в «Интеграция → API → История»). Шаг запускаsetupTemplateдобавлен вREADME.md,docs/SETUP.md,docs/TROUBLESHOOTING.mdи страницы вики (57125d7).SHEET_ID: жёстко блокируется проверкойisTemplateSheetId_().valalav referenced this issue2026-11-09 18:10:04 +00:00