// Batch-generates compliance reports into nested Drive folders
// Tracks progress across runs to handle 6-min execution limit
function generateComplianceReports() {
var startTime = new Date().getTime();
var BATCH_SIZE = 15;
var props = PropertiesService.getScriptProperties();
var currentRowIndex = parseInt(props.getProperty('currentRowIndex')) || 1;
var data = sheet.getDataRange().getValues();
for (var i = currentRowIndex; i < data.length; i++) {
if (processedCount >= BATCH_SIZE) break;
// Build nested folder: Year > Month > Week > Day > Part
var yearFolder = getOrCreateFolder(mainFolder, yearStr);
var monthFolder = getOrCreateFolder(yearFolder, monthStr);
var weekFolder = getOrCreateFolder(monthFolder, weekFolderName);
var dayFolder = getOrCreateFolder(weekFolder, dayFolderName);
var partFolder = getOrCreateFolder(dayFolder, part);
// Copy template and replace placeholders
var tempDoc = DriveApp.getFileById(templateId).makeCopy(partFolder);
var body = DocumentApp.openById(tempDoc.getId()).getBody();
body.replaceText("\\{\\{Participant Name\\}\\}", participantName);
body.replaceText("\\{\\{Docket \\#\\}\\}", docket);
body.replaceText("\\{\\{Adjourn\\. Date\\}\\}", adjournDate);
// Guard against 6-min timeout
if (new Date().getTime() - startTime > 280000) {
props.setProperty('currentRowIndex', i + 1);
return; // Resume on next run
}
processedCount++;
}
props.setProperty('currentRowIndex', currentRowIndex + processedCount);
}