function exportUnreadInboxEmailsToSheet() {
try {
var batchSize = 500;
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheetName = "Inbox";
var sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
sheet = spreadsheet.insertSheet(sheetName);
}
// Define headers
var headers = [
"Date",
"From",
"To",
"Subject",
"Body (first 300 chars)",
"Link",
"Booking Numbers"
];
var firstRow = sheet.getRange(1, 1, 1, headers.length).getValues()[0];
var isHeaderMissing = headers.some((header, index) => header !== firstRow[index]);
if (isHeaderMissing) {
sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
}
// Regex for booking numbers
const pattern = /\b(?:(?=[A-Z0-9]{12})(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{12}|(?=[A-Z0-9]{16})(?=[A-Z0-9]*ANEX)(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{16}|(?=[A-Z0-9]{13})(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{12}W|(?=ANEX[A-Z0-9]{12}W)(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{17})\)?\b/g;
var data = [];
var start = 0;
var totalEmails = 0;
var scriptProperties = PropertiesService.getScriptProperties();
var processedIds = scriptProperties.getProperty('processedMessageIds');
var processedIdSet = processedIds ? new Set(processedIds.split(',')) : new Set();
var myEmail = Session.getActiveUser().getEmail().toLowerCase();
var threads;
do {
threads = GmailApp.search('in:inbox is:unread', start, batchSize);
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
var message = messages[j];
var messageId = message.getId();
var fromEmail = message.getFrom().toLowerCase();
// Skip if already processed
if (processedIdSet.has(messageId)) {
continue;
}
// Skip if sent by me
if (fromEmail.indexOf(myEmail) !== -1) {
continue;
}
// Mark as processed
processedIdSet.add(messageId);
// Gather info
var timestamp = message.getDate();
var toEmail = message.getTo();
var subject = message.getSubject();
var bodyContent = message.getPlainBody().substring(0, 300);
// Extract booking numbers from subject and body using regex
var subjectMatches = subject.match(pattern) || [];
var bodyMatches = bodyContent.match(pattern) || [];
var allMatches = [...new Set([...subjectMatches, ...bodyMatches])];
var bookingNumbers = allMatches.length > 0 ? allMatches.join(", ") : "";
// Push data
data.push([
timestamp,
fromEmail,
toEmail,
subject,
bodyContent,
link,
bookingNumbers
]);
totalEmails++;
}
}
// Write to sheet in batches
if (data.length > 0) {
var lastRow = sheet.getLastRow();
sheet.getRange(lastRow + 1, 1, data.length, data[0].length).setValues(data);
data = [];
SpreadsheetApp.flush();
}
start += batchSize;
} while (threads.length === batchSize);
// Store updated processed IDs (limit to recent 10,000 to avoid size issues)
var processedIdArray = Array.from(processedIdSet);
if (processedIdArray.length > 10000) {
processedIdArray = processedIdArray.slice(processedIdArray.length - 10000);
}
scriptProperties.setProperty('processedMessageIds', processedIdArray.join(','));
} catch (e) {
throw e;
}
}
// Optional helper to reset processed IDs when you want to reprocess all
function resetProcessedMessageIds() {
PropertiesService.getScriptProperties().deleteProperty('processedMessageIds');