Cloudflare Deployment — Multi-user mode. AI runs via server-side Worker (API key never in browser). Sheet = shared database for the whole team. All users (Srikanth, Jay, Monu) open the same URL.
This name appears in every update log entry.
Paste the deployed Apps Script URL here. All team members (Srikanth, Jay, Monu) use the same URL. State loads on open, saves on every confirmed update.
Required outside claude.ai. Get from console.anthropic.com. If your corporate network blocks api.anthropic.com, use a mobile hotspot when logging AI updates.
One-time setup: open your Google Sheet → Extensions → Apps Script → paste below → Save → Deploy → Web App → Execute as Me → Anyone can access → Deploy → copy URL above.
// ENDPOINT — Scimplify Tungsten Ops — Database Script
// Paste into Extensions → Apps Script → Save → Deploy → Web App
// Execute as: Me | Who has access: Anyone
// After deploy: copy the /exec URL (NOT /dev) → paste in Endpoint Settings
const SHEET_NAME = "Endpoint_State";
const LOG_SHEET = "Endpoint_Log";
function doGet(e) {
// Called by loadFromSheet() — returns full state as JSON
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) return jsonResp({ ok: true, batches: [], orders: [], messages: [] });
var data = sheet.getDataRange().getValues();
if (data.length < 2) return jsonResp({ ok: true, batches: [], orders: [], messages: [] });
var headers = data[0];
var rows = data.slice(1).map(function(r) {
var obj = {};
headers.forEach(function(h, i) { obj[h] = r[i]; });
return obj;
});
var batches = rows.filter(function(r){ return r.type === "batch"; }).map(parseRow);
var orders = rows.filter(function(r){ return r.type === "order"; }).map(parseRow);
var messages = rows.filter(function(r){ return r.type === "message";}).map(parseRow);
return jsonResp({ ok: true, batches: batches, orders: orders, messages: messages });
} catch(err) {
return jsonResp({ ok: false, error: err.message });
}
}
function doPost(e) {
try {
var payload = JSON.parse(e.postData.contents);
var action = payload.action;
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (action === "init") {
var sheet = getOrCreateSheet(ss, SHEET_NAME, ["type","id","data","updatedAt"]);
var rows = [];
(payload.batches || []).forEach(function(b){ rows.push(["batch", b.batchId, JSON.stringify(b), new Date().toISOString()]); });
(payload.orders || []).forEach(function(o){ rows.push(["order", o.orderId, JSON.stringify(o), new Date().toISOString()]); });
(payload.messages || []).forEach(function(m){ rows.push(["message",m.id, JSON.stringify(m), new Date().toISOString()]); });
if (sheet.getLastRow() > 1) sheet.deleteRows(2, sheet.getLastRow() - 1);
if (rows.length) sheet.getRange(2, 1, rows.length, 4).setValues(rows);
logAction(ss, "init", payload.pushedBy || "system", "Full state pushed — " + (payload.batches||[]).length + " batches");
return jsonResp({ ok: true });
}
if (action === "update") {
var sheet = getOrCreateSheet(ss, SHEET_NAME, ["type","id","data","updatedAt"]);
var b = payload.batch;
if (!b) return jsonResp({ ok: false, error: "No batch in payload" });
var found = false;
var lastRow = sheet.getLastRow();
if (lastRow > 1) {
var ids = sheet.getRange(2, 2, lastRow - 1, 1).getValues();
for (var i = 0; i < ids.length; i++) {
if (ids[i][0] === b.batchId) {
sheet.getRange(i + 2, 3, 1, 2).setValues([[JSON.stringify(b), new Date().toISOString()]]);
found = true; break;
}
}
}
if (!found) sheet.appendRow(["batch", b.batchId, JSON.stringify(b), new Date().toISOString()]);
logAction(ss, "update", payload.loggedBy || "system", "Batch " + b.batchId + " → " + payload.updateType);
return jsonResp({ ok: true });
}
return jsonResp({ ok: false, error: "Unknown action: " + action });
} catch(err) {
return jsonResp({ ok: false, error: err.message });
}
}
function parseRow(row) {
try { return JSON.parse(row.data); } catch(e) { return row; }
}
function getOrCreateSheet(ss, name, headers) {
var s = ss.getSheetByName(name);
if (!s) { s = ss.insertSheet(name); s.appendRow(headers); s.setFrozenRows(1); }
return s;
}
function logAction(ss, action, user, note) {
var s = getOrCreateSheet(ss, LOG_SHEET, ["Timestamp","Action","User","Note"]);
s.appendRow([new Date().toISOString(), action, user, note]);
}
function jsonResp(obj) {
return ContentService
.createTextOutput(JSON.stringify(obj))
.setMimeType(ContentService.MimeType.JSON);
}
// Paste into Extensions → Apps Script → Save → Deploy → Web App → Anyone
const SHEET_NAME = "Endpoint_State";
const LOG_SHEET = "Endpoint_Log";
function doGet(e) {
try {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(SHEET_NAME);
if (!sheet) return json({ ok: false, error: "Sheet not found: " + SHEET_NAME });
var data = sheet.getDataRange().getValues();
if (data.length < 2) return json({ ok: true, batches: [], orders: [], messages: [] });
var headers = data[0];
var rows = data.slice(1).map(function(r) {
var obj = {};
headers.forEach(function(h, i) { obj[h] = r[i]; });
return obj;
});
var batches = rows.filter(function(r){ return r.type === "batch"; }).map(parseRow);
var orders = rows.filter(function(r){ return r.type === "order"; }).map(parseRow);
var messages = rows.filter(function(r){ return r.type === "message";}).map(parseRow);
return json({ ok: true, batches: batches, orders: orders, messages: messages });
} catch(err) {
return json({ ok: false, error: err.message });
}
}
function doPost(e) {
try {
var payload = JSON.parse(e.postData.contents);
var action = payload.action;
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (action === "init") {
// Full state push — replaces all rows
var sheet = getOrCreateSheet(ss, SHEET_NAME,
["type","id","data","updatedAt"]);
var rows = [];
(payload.batches || []).forEach(function(b){ rows.push(["batch", b.batchId, JSON.stringify(b), new Date().toISOString()]); });
(payload.orders || []).forEach(function(o){ rows.push(["order", o.orderId, JSON.stringify(o), new Date().toISOString()]); });
(payload.messages || []).forEach(function(m){ rows.push(["message",m.id, JSON.stringify(m), new Date().toISOString()]); });
// Clear data rows (keep header)
if (sheet.getLastRow() > 1) sheet.deleteRows(2, sheet.getLastRow() - 1);
if (rows.length) sheet.getRange(2, 1, rows.length, 4).setValues(rows);
logAction(ss, "init", payload.pushedBy || "system", "Full state pushed");
return json({ ok: true });
}
if (action === "update") {
// Single batch update (upsert row by batchId)
var sheet = getOrCreateSheet(ss, SHEET_NAME,
["type","id","data","updatedAt"]);
var b = payload.batch;
if (!b) return json({ ok: false, error: "No batch in payload" });
var found = false;
var lastRow = sheet.getLastRow();
if (lastRow > 1) {
var ids = sheet.getRange(2, 2, lastRow - 1, 1).getValues();
for (var i = 0; i < ids.length; i++) {
if (ids[i][0] === b.batchId) {
sheet.getRange(i + 2, 3, 1, 2).setValues([[JSON.stringify(b), new Date().toISOString()]]);
found = true; break;
}
}
}
if (!found) sheet.appendRow(["batch", b.batchId, JSON.stringify(b), new Date().toISOString()]);
logAction(ss, "update", payload.loggedBy || "system",
"Batch " + b.batchId + " stage " + payload.stage + " → " + payload.updateType);
return json({ ok: true });
}
if (action === "addMessage") {
var sheet = getOrCreateSheet(ss, SHEET_NAME, ["type","id","data","updatedAt"]);
var m = payload.message;
sheet.appendRow(["message", m.id, JSON.stringify(m), new Date().toISOString()]);
return json({ ok: true });
}
return json({ ok: false, error: "Unknown action: " + action });
} catch(err) {
return json({ ok: false, error: err.message });
}
}
function parseRow(row) {
try { return JSON.parse(row.data); } catch(e) { return row; }
}
function getOrCreateSheet(ss, name, headers) {
var s = ss.getSheetByName(name);
if (!s) {
s = ss.insertSheet(name);
s.appendRow(headers);
s.setFrozenRows(1);
}
return s;
}
function logAction(ss, action, user, note) {
var s = getOrCreateSheet(ss, LOG_SHEET,
["Timestamp","Action","User","Note"]);
s.appendRow([new Date().toISOString(), action, user, note]);
}
function json(obj) {
return ContentService
.createTextOutput(JSON.stringify(obj))
.setMimeType(ContentService.MimeType.JSON);
}