Operational notices, selection cycles, training schedules, and unit updates from Battalion HQ.
Posting uses the cadre password — the same one that opens the Cadre Wing.
Images are linked, not uploaded — paste a direct link ending in .png or .jpg. Imgur works well. Avoid Discord attachment links: they expire and will break.
Insert a blank row directly under the header, click cell A2, and paste. The row splits itself across the columns.
One-click publishing is active — Publish writes straight to the sheet, and the password is verified by Google rather than in the browser. Kept here in case the deployment ever needs rebuilding.
/exec URL.function doPost(e) {
var NEWS_SHEET = '1K0JrkBr1EDIqlZfhla7C9Dnauxl2br6QFa9QvV4NLsg';
var PW_SHEET = '136R9Sl1JSmARjzXjEXd3T1CCoAlnlBqqMKUEnmvjPpA';
var out = function (o) {
return ContentService.createTextOutput(JSON.stringify(o))
.setMimeType(ContentService.MimeType.JSON);
};
try {
var d = JSON.parse(e.postData.contents);
var pw = String(
SpreadsheetApp.openById(PW_SHEET).getSheets()[0].getRange('A1').getValue()
).trim();
if (String(d.pw || '').trim() !== pw) return out({ ok: false, error: 'bad password' });
var sh = SpreadsheetApp.openById(NEWS_SHEET).getSheets()[0];
sh.insertRowAfter(1);
sh.getRange(2, 1, 1, 6).setValues([[
d.date || '', d.title || '', d.body || '',
d.image || '', d.author || '', d.pinned || 'NO'
]]);
sh.getRange(2, 1, 1, 6).setNumberFormat('@');
return out({ ok: true });
} catch (err) {
return out({ ok: false, error: String(err) });
}
}