Complete Setup Guide with All Code
Print this document for easy reference during setup
/**
* šŗ MIDORI'S 70TH BIRTHDAY CAMERA - GOOGLE APPS SCRIPT
* This script saves photos to Google Drive and logs data to a spreadsheet
*/
// š CONFIGURATION - Edit these names if you want
var FOLDER_NAME = "Midori 70th Birthday Photos";
var SPREADSHEET_NAME = "Midori Birthday Submissions";
/**
* Main function that handles POST requests from the camera
*/
function doPost(e) {
try {
var data = JSON.parse(e.postData.contents);
var folder = getOrCreateFolder(FOLDER_NAME);
var photoFile = savePhotoToDrive(data.photo, data.name, data.frame, data.timestamp, folder);
logToSpreadsheet(data, photoFile.getUrl());
return ContentService.createTextOutput(JSON.stringify({
success: true,
message: "Photo uploaded successfully!",
photoUrl: photoFile.getUrl(),
photoId: photoFile.getId()
})).setMimeType(ContentService.MimeType.JSON);
} catch (error) {
return ContentService.createTextOutput(JSON.stringify({
success: false,
error: error.toString()
})).setMimeType(ContentService.MimeType.JSON);
}
}
function getOrCreateFolder(folderName) {
var folders = DriveApp.getFoldersByName(folderName);
if (folders.hasNext()) {
return folders.next();
} else {
return DriveApp.createFolder(folderName);
}
}
function savePhotoToDrive(photoBase64, name, frame, timestamp, folder) {
var base64Data = photoBase64.split(',')[1];
var blob = Utilities.newBlob(
Utilities.base64Decode(base64Data),
'image/jpeg',
sanitizeFileName(name) + '_' + frame + '_' + new Date().getTime() + '.jpg'
);
var file = folder.createFile(blob);
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
return file;
}
function logToSpreadsheet(data, photoUrl) {
var spreadsheet = getOrCreateSpreadsheet(SPREADSHEET_NAME);
var sheet = spreadsheet.getActiveSheet();
if (sheet.getLastRow() === 0) {
sheet.appendRow(['Timestamp', 'Name', 'Comment', 'Frame Type', 'Photo URL', 'Date/Time']);
sheet.getRange(1, 1, 1, 6).setFontWeight('bold').setBackground('#ff6b9d').setFontColor('white');
}
sheet.appendRow([
data.timestamp,
data.name,
data.comment || '(No message)',
data.frame,
photoUrl,
new Date()
]);
sheet.autoResizeColumns(1, 6);
}
function getOrCreateSpreadsheet(name) {
var files = DriveApp.getFilesByName(name);
if (files.hasNext()) {
return SpreadsheetApp.open(files.next());
} else {
return SpreadsheetApp.create(name);
}
}
function sanitizeFileName(name) {
return name.replace(/[^a-z0-9]/gi, '_').substring(0, 50);
}
function testSetup() {
Logger.log("Testing setup...");
var folder = getOrCreateFolder(FOLDER_NAME);
Logger.log("ā Folder created: " + folder.getName());
Logger.log("Folder URL: " + folder.getUrl());
var spreadsheet = getOrCreateSpreadsheet(SPREADSHEET_NAME);
Logger.log("ā Spreadsheet created: " + spreadsheet.getName());
Logger.log("Spreadsheet URL: " + spreadsheet.getUrl());
Logger.log("\nā
Setup complete!");
}
function generateGalleryHTML() {
var folder = getOrCreateFolder(FOLDER_NAME);
var files = folder.getFiles();
var html = '<div class="birthday-gallery" style="display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 20px; padding: 20px;">\n';
while (files.hasNext()) {
var file = files.next();
var imageUrl = "https://drive.google.com/uc?export=view&id=" + file.getId();
html += ' <div style="border-radius: 15px; overflow: hidden; box-shadow: 0 4px 12px rgba(0,0,0,0.1);">\n';
html += ' <img src="' + imageUrl + '" style="width: 100%; height: auto; display: block;">\n';
html += ' </div>\n';
}
html += '</div>';
Logger.log(html);
return html;
}
Click "Deploy"
https://script.google.com/macros/s/AKfycbxXXXXXXXXX/execYou should see in the logs:
Click the URLs to verify they exist in your Google Drive!
YOUR_SCRIPT_ID_HEREvar SCRIPT_URL = 'https://script.google.com/macros/s/YOUR_SCRIPT_ID_HERE/exec';
YOUR_SCRIPT_ID_HERE with your actual URL from Step 2.3var SCRIPT_URL = 'https://script.google.com/macros/s/AKfycbxXXXXXXXX/exec';
Re-run this function whenever you want to update the gallery with new photos
Fixed! The updated code uses natural aspect ratio. If still zoomed, try a different browser.
Edit these lines in the Google Apps Script:
var FOLDER_NAME = "Midori 70th Birthday Photos"; var SPREADSHEET_NAME = "Midori Birthday Submissions";
In the Google Apps Script, find and remove this line (around line 79):
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
Add this code after line 47 in the doPost function:
MailApp.sendEmail({
to: "your@email.com",
subject: "New Birthday Photo from " + data.name,
body: "New submission!\n\nName: " + data.name + "\nMessage: " + data.comment
});
Check the Google Apps Script "Execution log" for error messages
Use the testSetup() function to verify connections
All photos are timestamped automatically - no duplicates!
Made with aloha šŗ