Files
PFTR-Processor/code.gs
T
2026-06-11 01:40:32 -04:00

145 lines
4.6 KiB
JavaScript

function processSpecificFolder() {
const DATED_FOLDER_ID = "";
const API_URL = "https://pft2pftr.williambr.uno/process-pdf";
const datedFolder = DriveApp.getFolderById(DATED_FOLDER_ID);
processPdfFilesInFolder(datedFolder, API_URL);
}
function processNewPdfs() {
// 1. Configuration
const ACTIVE_PROVIDERS_FOLDER_ID = "12Ppr39dN-mdzRKMxBhABgFkWmfMX_f7O";
const API_URL = "https://pft2pftr.williambr.uno/process-pdf";
// Set cutoff date to May 1, 2026
const CUTOFF_DATE = new Date(2026, 5, 1); // Note: Month is 0-indexed (4 = May)
const activeProvidersFolder = DriveApp.getFolderById(ACTIVE_PROVIDERS_FOLDER_ID);
const providerFolders = activeProvidersFolder.getFolders();
// 2. Loop through Provider Folders (e.g., NP jeong, Dr Santos)
while (providerFolders.hasNext()) {
const providerFolder = providerFolders.next();
Logger.log("Scanning provider folder: " + providerFolder.getName());
const dateFolders = providerFolder.getFolders();
// 3. Loop through Date Folders (e.g., 05.21.2026)
while (dateFolders.hasNext()) {
const dateFolder = dateFolders.next();
const folderName = dateFolder.getName();
const folderDate = parseFolderNameAsDate(folderName);
// Skip if the folder name is not a valid date format
if (!folderDate) {
Logger.log(" Skipping folder (Not a valid MM.DD.YYYY date): " + folderName);
continue;
}
// 4. Date Filter: Check if folder is 05.01.2026 or newer
if (folderDate >= CUTOFF_DATE) {
Logger.log(" Processing valid date folder: " + folderName);
processPdfFilesInFolder(dateFolder, API_URL);
} else {
Logger.log(" Skipping older folder: " + folderName);
}
}
}
}
// Converts "05.21.2026" string format into a real JavaScript Date object
function parseFolderNameAsDate(folderName) {
const parts = folderName.split(".");
if (parts.length !== 3) return null;
const month = parseInt(parts[0], 10) - 1; // 0-indexed months
const day = parseInt(parts[1], 10);
const year = parseInt(parts[2], 10);
if (isNaN(month) || isNaN(day) || isNaN(year)) return null;
return new Date(year, month, day);
}
// Processes the actual PDF files inside the matching date folders
function processPdfFilesInFolder(folder, apiUrl) {
const files = folder.getFiles();
while (files.hasNext()) {
const file = files.next();
if (file.getMimeType() === MimeType.PDF) {
if (file.getDescription() === "API_REPORT_PROCESSED") {
Logger.log("Skipping " + file.getName() + " - already processed.");
continue; // Skip to the next file
}
sendAndOverwritePdf(file, apiUrl);
}
}
}
function getPdfPageCount(file) {
try {
const blob = file.getBlob();
const data = blob.getDataAsString();
const matches = data.match(/\/Type\s*\/Pages[\s\S]*?\/Count\s*(\d+)/g);
if (matches && matches.length > 0) {
const countMatch = matches[matches.length - 1].match(/\/Count\s*(\d+)/);
if (countMatch) {
return parseInt(countMatch, 10);
}
}
return -1;
} catch (e) {
Logger.log("Error reading page count for " + file.getName() + ": " + e.message);
return -1;
}
}
function sendAndOverwritePdf(file, apiUrl) {
const fileId = file.getId();
const fileName = file.getName();
try {
const pdfBlob = file.getBlob();
const formData = { "file": pdfBlob };
const options = {
"method": "POST",
"payload": formData,
"muteHttpExceptions": true
};
Logger.log(" Sending " + fileName + " to API...");
const response = UrlFetchApp.fetch(apiUrl, options);
if (response.getResponseCode() !== 200) {
Logger.log(" API Error for " + fileName + ": " + response.getContentText());
return;
}
const responseBlob = response.getBlob();
if (responseBlob.getContentType() !== MimeType.PDF) {
Logger.log(" Skipping overwrite. API did not return a valid PDF.");
return;
}
const updateUrl = "https://www.googleapis.com/upload/drive/v3/files/" + fileId + "?uploadType=media";
const updateOptions = {
"method": "PATCH",
"headers": {
"Authorization": "Bearer " + ScriptApp.getOAuthToken(),
"Content-Type": MimeType.PDF
},
"payload": responseBlob.getBytes()
};
UrlFetchApp.fetch(updateUrl, updateOptions);
file.setDescription("API_REPORT_PROCESSED");
Logger.log(" Successfully processed and overwritten: " + fileName);
} catch (e) {
Logger.log(" Failed to process file " + fileName + ": " + e.message);
}
}