Terminal 08-A // SECURED
System Administration v2.0
| ID | Name | Dept | Rank | Status | Credential | Actions |
|---|
| UID | Asset Name | Location | Active Protocols | Actions |
|---|
| UID | Asset Name | Location | Actions |
|---|
Single-Sheet Architecture for Config & Data
1. Open a new Google Sheet and navigate to Extensions > Apps Script.
2. In the default Code.gs file, delete any existing code and paste the AutoTPM-Bridge script below.
3. Select the setupSheets function from the top toolbar and click Run to generate all database tabs (Users, Machines, Logs, etc.).
*Note: Google will ask for permission. Click "Review Permissions" > Choose your account > Click "Advanced" > Click "Go to Untitled project (unsafe)".
4. Click Deploy > New Deployment. Choose type: Web App.
5. Set Execute as: "Me", Who has access: "Anyone".
6. Copy the resulting Web App URL and paste it into the configuration box above.
/**
* AutoTPM Bridge - Google Apps Script v1.2
* Added: Personnel Department Mapping
*/
function setupSheets() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const requiredSheets = ["Users", "Machines", "MaintenanceTasks", "Logs", "Settings"];
requiredSheets.forEach(sheetName => {
let sheet = ss.getSheetByName(sheetName);
if (!sheet) sheet = ss.insertSheet(sheetName);
});
// Setup User Table Headers (Column C is now Department)
const usersSheet = ss.getSheetByName("Users");
if (usersSheet.getLastRow() === 0) {
usersSheet.appendRow(["emp_id", "name", "department", "pin", "tier", "role", "is_active", "last_updated"]);
usersSheet.getRange("A1:H1").setFontWeight("bold").setBackground("#e2e8f0");
}
const machinesSheet = ss.getSheetByName("Machines");
if (machinesSheet.getLastRow() === 0) {
machinesSheet.appendRow(["uid", "name", "model", "area", "status", "minTier", "last_updated"]);
machinesSheet.getRange("A1:G1").setFontWeight("bold").setBackground("#e2e8f0");
}
const logSheet = ss.getSheetByName("Settings");
if (logSheet.getLastRow() === 0) {
logSheet.appendRow(["Log_Type", "Message", "Timestamp"]);
logSheet.getRange("A1:C1").setFontWeight("bold").setBackground("#e2e8f0");
logSheet.appendRow(["System", "Bridge Initialized Successfully", new Date().toISOString()]);
}
}
function doPost(e) {
try {
const data = JSON.parse(e.postData.contents);
const action = data.action;
const ss = SpreadsheetApp.getActiveSpreadsheet();
if (action === 'handshake') {
const sheet = ss.getSheetByName("Settings") || ss.insertSheet("Settings");
sheet.appendRow(["Handshake", "Successful connection", new Date().toISOString()]);
return ContentService.createTextOutput(JSON.stringify({ status: "success", message: "Handshake verified." })).setMimeType(ContentService.MimeType.JSON);
}
if (action === 'push') {
const { users, machines } = data.payload;
if (users && users.length > 0) {
const sheet = ss.getSheetByName("Users");
// Clear 8 columns (A-H)
if (sheet.getLastRow() > 1) sheet.getRange(2, 1, sheet.getLastRow() - 1, 8).clearContent();
const rows = users.map(u => [u.emp_id, u.name, u.department || 'GENERAL', u.pin, u.tier, u.role || 'user', u.is_active, new Date().toISOString()]);
sheet.getRange(2, 1, rows.length, 8).setValues(rows);
}
if (machines && machines.length > 0) {
const sheet = ss.getSheetByName("Machines");
if (sheet.getLastRow() > 1) sheet.getRange(2, 1, sheet.getLastRow() - 1, 7).clearContent();
const rows = machines.map(m => [m.uid, m.name, m.model || 'N/A', m.area || 'General', m.status, m.minTier, new Date().toISOString()]);
sheet.getRange(2, 1, rows.length, 7).setValues(rows);
}
return ContentService.createTextOutput(JSON.stringify({ status: "success", message: "Data backed up." })).setMimeType(ContentService.MimeType.JSON);
}
if (action === 'pull') {
return processPullRequest(ss);
}
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: error.toString() })).setMimeType(ContentService.MimeType.JSON);
}
}
function doGet(e) {
try {
const action = e.parameter.action;
if (action === 'pull') {
const ss = SpreadsheetApp.getActiveSpreadsheet();
return processPullRequest(ss);
}
return ContentService.createTextOutput("AutoTPM Bridge Webhook is Active.");
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({ status: "error", message: error.toString() })).setMimeType(ContentService.MimeType.JSON);
}
}
// Shared helper to handle data retrieval
function processPullRequest(ss) {
const usersSheet = ss.getSheetByName("Users");
const machinesSheet = ss.getSheetByName("Machines");
const users = [];
if (usersSheet && usersSheet.getLastRow() > 1) {
// Read 7 columns (A-G) to reconstruct the user object
const uData = usersSheet.getRange(2, 1, usersSheet.getLastRow() - 1, 7).getValues();
uData.forEach(r => {
if(r[0]) users.push({
emp_id: String(r[0]),
name: String(r[1]),
department: String(r[2]),
pin: String(r[3]),
tier: Number(r[4]),
role: String(r[5]),
is_active: Number(r[6])
});
});
}
const machines = [];
if (machinesSheet && machinesSheet.getLastRow() > 1) {
const mData = machinesSheet.getRange(2, 1, machinesSheet.getLastRow() - 1, 6).getValues();
mData.forEach(r => {
if(r[0]) machines.push({
uid: String(r[0]),
name: String(r[1]),
model: String(r[2]),
area: String(r[3]),
status: String(r[4]),
minTier: Number(r[5])
});
});
}
return ContentService.createTextOutput(JSON.stringify({ status: "success", payload: { users, machines } })).setMimeType(ContentService.MimeType.JSON);
}
Enterprise Workflow Integration
Note: This feature is currently in 'Readiness Mode' for future corporate middleware linkage.