... another project for this hackathon: World’s Largest Hackathon presented by Bolt
Build with AI for a shot at some of the $1M+ in prizes.
You can find my project on the official webpage.
2D, 3D, game, games, online game, game development, game engine, programming, OpenGL, Open AI, math, graphics, design, graphic, graphics, game development, game engine, programming, web development, web art, web graphic, arts, tutorial, tutorials,
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Ocazii Scraper')
.addItem('Scrape placa-de-baza', 'scrapeProcess_placa_de_baza')
.addToUi();
}
function scrapeProcess_placa_de_baza() {
const url_placa_de_baza = "https://www.okazii.ro/componente-computere/placa-de-baza/?judete_lp=35&sort=pret_asc";
let html;
try {
const response = UrlFetchApp.fetch(url_placa_de_baza);
html = response.getContentText();
} catch (error) {
Logger.log("Error fetching HTML: " + error.message);
return;
}
const itemRegex = /<div class="list-item[\s\S]*?<h2>[\s\S]*?<a[^>]+href="(.*?)"[^>]+title="(.*?)"[\s\S]*?<span class="prSup"><span>(\d+)<\/span>[\s\S]*?<span class="prList"><span>([\d,]+)<\/span>/g;
const spreadsheetName = "placa_baza_200625";
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = spreadsheet.getSheetByName(spreadsheetName) || spreadsheet.insertSheet(spreadsheetName);
// Adaugă headere dacă e un sheet nou
if (sheet.getLastRow() === 0) {
sheet.appendRow(["Data", "Titlu", "Href", "Pret", "Livrare"]);
}
const now = new Date();
const formattedDate = Utilities.formatDate(now, SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "ddMMyy");
let match;
while ((match = itemRegex.exec(html)) !== null) {
let [_, href, title, price, delivery] = match;
delivery = delivery.replace(",", "."); // înlocuiește virgula pentru formatare numerica
const row = [formattedDate, title, href, price, delivery];
sheet.appendRow(row);
}
}
bolt.new/github.com/username/reponame
// try {
// const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// const currentDate = new Date();
// extractedData.forEach((movie, rowIndex) => {
// if (movie.title !== "N/A" && movie.image !== "N/A") {
// const imageFormula = `=IMAGE("${movie.image}")`;
// const rowIndexAdjusted = sheet.getLastRow() + 1;
// sheet.appendRow([currentDate, movie.title, imageFormula, movie.channel, movie.time]);
// sheet.setRowHeight(rowIndexAdjusted, 76); // Set row height to 330px
// }
// });
// Logger.log("Processed movies count: ", extractedData.length);
// } catch (error) {
// Logger.log("Error adding data to spreadsheet: ", error.message);
// }
try {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const currentDate = new Date();
// Formatăm data curentă pentru numele sheet-ului
const formattedDate = Utilities.formatDate(currentDate, SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "yyyy-MM-dd");
const sheetName = `Data-${formattedDate}`;
// Verificăm dacă sheet-ul cu acest nume există deja
let sheet = spreadsheet.getSheetByName(sheetName);
if (!sheet) {
// Creăm un nou sheet dacă nu există
sheet = spreadsheet.insertSheet(sheetName);
}
extractedData.forEach((movie) => {
if (movie.title !== "N/A" && movie.image !== "N/A") {
const imageFormula = `=IMAGE("${movie.image}")`;
const rowIndexAdjusted = sheet.getLastRow() + 1;
sheet.appendRow([currentDate, movie.title, imageFormula, movie.channel, movie.time]);
// Păstrăm formatarea originală pentru înălțimea rândurilor
sheet.setRowHeight(rowIndexAdjusted, 76);
}
});
} catch (error) {
console.error("A apărut o eroare:", error.message);
}
function scrapeProcessAndCleanUp() {
const url = "https://www.cinemagia.ro/program-tv/filme-la-tv/filme-pro-tv,antena-1,tvr-1,prima-tv,diva,pro-cinema,film-cafe/azi/";
let html;
try {
const response = UrlFetchApp.fetch(url);
html = response.getContentText();
Logger.log("Fetched HTML content length: ", html.length);
} catch (error) {
Logger.log("Error fetching HTML content: ", error.message);
return;
}
let doc;
try {
doc = DocumentApp.create("Temporary HTML Content");
doc.appendParagraph(html);
doc.saveAndClose();
Logger.log("Document created successfully with ID: ", doc.getId());
} catch (error) {
Logger.log("Error creating/saving document: ", error.message);
return;
}
let text;
try {
const document = DocumentApp.openById(doc.getId());
text = document.getBody().getText();
Logger.log("Document text content length: ", text.length);
} catch (error) {
Logger.log("Error opening document or extracting text: ", error.message);
return;
}
const titles = [...text.matchAll(/<li class="first">(.*?)<\/li>/g)];
const images = [...text.matchAll(/<img src="(https:\/\/static\.cinemagia\.ro\/img\/resize\/db\/movie.*?)"/g)];
const channels = [...text.matchAll(/<span class="r1">(.*?)<\/span>/g)];
const times = [...text.matchAll(/<span class="r2">(.*?)<\/span>/g)];
Logger.log("Titles found: ", titles.length);
Logger.log("Images found: ", images.length);
Logger.log("Channels found: ", channels.length);
Logger.log("Times found: ", times.length);
const extractedData = titles.map((title, index) => {
const image = images[index] ? images[index][1] : "N/A";
const channel = channels[index] ? channels[index][1].trim() : "N/A";
const time = times[index] ? times[index][1].trim() : "N/A";
return {
title: title[1].trim(),
image: image,
channel: channel,
time: time
};
});
try {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const currentDate = new Date();
extractedData.forEach((movie, rowIndex) => {
if (movie.title !== "N/A" && movie.image !== "N/A") {
const imageFormula = `=IMAGE("${movie.image}")`;
const rowIndexAdjusted = sheet.getLastRow() + 1;
sheet.appendRow([currentDate, movie.title, imageFormula, movie.channel, movie.time]);
sheet.setRowHeight(rowIndexAdjusted, 76); // Set row height to 330px
}
});
Logger.log("Processed movies count: ", extractedData.length);
} catch (error) {
Logger.log("Error adding data to spreadsheet: ", error.message);
}
}
/**
* Main function to check files in the root folder and add duplicates to the active spreadsheet
*/
function checkDuplicatesInDrive() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// Clear the sheet and set up headers
sheet.clear();
sheet.appendRow(["Group", "File Name", "Size", "Type", "File Path", "Date Created", "Last Updated", "URL"]);
sheet.getRange(1, 1, 1, 8).setFontWeight("bold").setBackground("#f3f3f3");
// Find all duplicates
const duplicates = findDuplicateFiles(true);
// Check if any duplicates were found
if (Object.keys(duplicates).length === 0) {
sheet.appendRow(["No duplicate files found"]);
sheet.autoResizeColumns(1, 8);
return;
}
// Add duplicates to the sheet
addDuplicatesToSheet(duplicates, sheet);
// Auto-resize columns
sheet.autoResizeColumns(1, 8);
}
/**
* Adds duplicate files to the specified sheet
*/
function addDuplicatesToSheet(duplicates, sheet) {
let groupNumber = 1;
let rowIndex = 2;
let totalDuplicateFiles = 0;
for (const key in duplicates) {
const files = duplicates[key];
totalDuplicateFiles += files.length;
files.forEach((file, index) => {
// Get file path
const filePath = getFilePath(file.id);
sheet.appendRow([
groupNumber,
file.name,
formatFileSize(file.size),
file.mimeType,
filePath,
file.dateCreated.toLocaleString(),
file.lastUpdated.toLocaleString(),
file.url
]);
// Add hyperlink to the file URL
sheet.getRange(rowIndex, 8).setFormula(`=HYPERLINK("${file.url}","Open File")`);
rowIndex++;
});
groupNumber++;
}
// Add summary at the bottom - only if we have duplicates
if (totalDuplicateFiles > 0) {
sheet.appendRow(["SUMMARY"]);
sheet.appendRow([`Found ${totalDuplicateFiles} duplicate files in ${groupNumber - 1} groups.`]);
}
return totalDuplicateFiles;
}
/**
* Gets the file path for a given file ID
*/
function getFilePath(fileId) {
try {
const file = DriveApp.getFileById(fileId);
const parents = file.getParents();
if (parents.hasNext()) {
const parent = parents.next();
return getFolderPath(parent) + "/" + file.getName();
} else {
return "/" + file.getName();
}
} catch (e) {
return "Path not available";
}
}
/**
* Gets the folder path for a given folder
*/
function getFolderPath(folder) {
try {
const parents = folder.getParents();
if (!parents.hasNext()) {
return "/" + folder.getName();
}
const parent = parents.next();
return getFolderPath(parent) + "/" + folder.getName();
} catch (e) {
return "/Unknown";
}
}
/**
* Finds duplicate files in Google Drive based on file size and optionally file type.
* @param {boolean} considerFileType Whether to consider file type when finding duplicates (default: true)
* @param {string} folderId Optional folder ID to search in. If not provided, searches in the entire Drive.
* @return {Object} An object containing groups of duplicate files
*/
function findDuplicateFiles(considerFileType = true, folderId = null) {
// Create a map to store files by their size (and optionally type)
const fileMap = {};
// Get files to check
let files;
if (folderId) {
const folder = DriveApp.getFolderById(folderId);
files = folder.getFiles();
} else {
files = DriveApp.getFiles();
}
// Process each file
while (files.hasNext()) {
const file = files.next();
// Skip Google Docs, Sheets, etc. as they don't have a fixed size
if (file.getSize() === 0) continue;
const fileSize = file.getSize();
const mimeType = file.getMimeType();
// Create a key based on file size and optionally type
let key = fileSize.toString();
if (considerFileType) {
key += '_' + mimeType;
}
// Add file to the map
if (!fileMap[key]) {
fileMap[key] = [];
}
fileMap[key].push({
id: file.getId(),
name: file.getName(),
size: fileSize,
mimeType: mimeType,
url: file.getUrl(),
dateCreated: file.getDateCreated(),
lastUpdated: file.getLastUpdated()
});
}
// Filter out unique files (groups with only one file)
const duplicates = {};
for (const key in fileMap) {
if (fileMap[key].length > 1) {
duplicates[key] = fileMap[key];
}
}
return duplicates;
}
/**
* Alternative function to check files in a specific folder and its subfolders
*/
function checkDuplicatesInFolder() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// Clear the sheet and set up headers
sheet.clear();
sheet.appendRow(["Group", "File Name", "Size", "Type", "File Path", "Date Created", "Last Updated", "URL"]);
sheet.getRange(1, 1, 1, 8).setFontWeight("bold").setBackground("#f3f3f3");
// Collect all files from the folder and subfolders
var fileMap = {};
var rootFolder = DriveApp.getRootFolder(); // Change this to your specific folder if needed
collectFilesFromFolder(rootFolder, fileMap);
// Filter out unique files
const duplicates = {};
for (const key in fileMap) {
if (fileMap[key].length > 1) {
duplicates[key] = fileMap[key];
}
}
// Check if any duplicates were found
if (Object.keys(duplicates).length === 0) {
sheet.appendRow(["No duplicate files found"]);
sheet.autoResizeColumns(1, 8);
return;
}
// Add duplicates to the sheet
addDuplicatesToSheet(duplicates, sheet);
// Auto-resize columns
sheet.autoResizeColumns(1, 8);
}
/**
* Recursively collects files from a folder and its subfolders
*/
function collectFilesFromFolder(folder, fileMap, considerFileType = true) {
// Process files in this folder
var files = folder.getFiles();
while (files.hasNext()) {
const file = files.next();
// Skip Google Docs, Sheets, etc. as they don't have a fixed size
if (file.getSize() === 0) continue;
const fileSize = file.getSize();
const mimeType = file.getMimeType();
// Create a key based on file size and optionally type
let key = fileSize.toString();
if (considerFileType) {
key += '_' + mimeType;
}
// Add file to the map
if (!fileMap[key]) {
fileMap[key] = [];
}
fileMap[key].push({
id: file.getId(),
name: file.getName(),
size: fileSize,
mimeType: mimeType,
url: file.getUrl(),
dateCreated: file.getDateCreated(),
lastUpdated: file.getLastUpdated()
});
}
// Process subfolders
var subfolders = folder.getFolders();
while (subfolders.hasNext()) {
var subfolder = subfolders.next();
collectFilesFromFolder(subfolder, fileMap, considerFileType);
}
}
/**
* Helper function to format file size in a human-readable format
*/
function formatFileSize(bytes) {
if (bytes < 1024) return bytes + " bytes";
else if (bytes < 1048576) return (bytes / 1024).toFixed(2) + " KB";
else if (bytes < 1073741824) return (bytes / 1048576).toFixed(2) + " MB";
else return (bytes / 1073741824).toFixed(2) + " GB";
}
/**
* Creates a new Google Spreadsheet with the duplicate files report
*/
function createDuplicateFilesSpreadsheet() {
const duplicates = findDuplicateFiles(true);
// Create a new spreadsheet
const ss = SpreadsheetApp.create("Duplicate Files Report - " + new Date().toLocaleString());
const sheet = ss.getActiveSheet();
// Set up headers
sheet.appendRow(["Group", "File Name", "Size", "Type", "File Path", "Date Created", "Last Updated", "URL"]);
// Format header row
sheet.getRange(1, 1, 1, 8).setFontWeight("bold").setBackground("#f3f3f3");
// Check if any duplicates were found
if (Object.keys(duplicates).length === 0) {
sheet.appendRow(["No duplicate files found"]);
sheet.autoResizeColumns(1, 8);
return ss.getUrl();
}
// Add duplicates to the sheet
addDuplicatesToSheet(duplicates, sheet);
// Auto-resize columns
sheet.autoResizeColumns(1, 8);
Logger.log(`Spreadsheet created: ${ss.getUrl()}`);
return ss.getUrl();
}
function generateDriveUsageReportPie() {
var drive = DriveApp.getRootFolder();
var files = drive.getFiles();
var data = [['Nume Fișier', 'Dimensiune (KB)']];
while (files.hasNext()) {
var file = files.next();
var fileSizeBytes = file.getSize();
var fileSizeKB = fileSizeBytes / 1024; // Convertim dimensiunea în KB
data.push([file.getName(), fileSizeKB]);
}
// open Google Sheet
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('Drive Usage Report');
if (!sheet) {
sheet = spreadsheet.insertSheet('Drive Usage Report');
}
// clean sheet
sheet.clear();
// write values
sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
// clean charts from Google Sheets
var charts = sheet.getCharts();
for (var i = 0; i < charts.length; i++) {
sheet.removeChart(charts[i]);
}
// create and add the Pie Chart with all values
var chart = sheet.newChart()
.asPieChart()
.setTitle('Utilizare Google Drive')
.addRange(sheet.getRange(2, 1, data.length - 1, 2)) // Exclude header row
.setPosition(5, 1, 0, 0)
.setOption('title', 'Utilizare Google Drive')
.setOption('legend', {position: 'top'})
.build();
sheet.insertChart(chart);
Logger.log('Raport generat cu succes.');
}