Get faces generated from scratch by AI using generated.photos API
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* generated.photos API demo >> Faces generated from scratch by AI | |
* | |
* 1. Get API key at https://generated.photos/api | |
* 2. Make a copy of https://docs.google.com/spreadsheets/d/1RkLy6e0h1QURtsOj1gsAfWGzvAUua0yIky_THy8ut1Q | |
* 3. Write your API key inside cell C3 (don't share!) | |
* | |
* Please, note: | |
* - Just 50 API calls/month! (API free plan) | |
* - Some trait combinations apparently fail to return results :-? | |
* - Script does not check for any errors | |
* | |
* @OnlyCurrentDoc | |
*/ | |
function getPhotos() { | |
// Some constants... | |
const PARAM_RANGE = 'A3:C15'; | |
const PIC_256 = 3; | |
const PIC_HEIGHT = 256; | |
const ROW_PICS = 17; | |
const COL_PICS = 2; | |
const ENDPOINT = 'https://api.generated.photos/api/v1/faces'; | |
// Pull params from spreadsheet | |
const sheet = SpreadsheetApp.getActiveSheet(); | |
const params = sheet.getRange(PARAM_RANGE).getValues(); | |
// Build query string | |
const queryString = params.reduce((stringSoFar, param) => `${stringSoFar}${param[0]}=${param[2]}&`, `${ENDPOINT}?`).slice(0, -1); | |
// Get faces | |
const apiResponse = JSON.parse(UrlFetchApp.fetch(queryString).getContentText()); | |
const picUrls = apiResponse.faces.map(faceUrl => faceUrl.urls[PIC_256]['256']); | |
// Remove previous images in spreadsheet | |
sheet.getImages().forEach(image => image.remove()); | |
// Make room for pics, if necessary | |
const availableRows = sheet.getMaxRows() - ROW_PICS + 1; | |
const neededRows = Math.ceil(picUrls.length / 2); | |
if (neededRows > availableRows) { | |
sheet.insertRowsAfter(ROW_PICS - 1, neededRows - availableRows); | |
// Flush new rows (does not seem to be required?) | |
SpreadsheetApp.flush(); | |
sheet.setRowHeights(ROW_PICS, neededRows, PIC_HEIGHT); | |
} | |
// Insert pics, 2 per row | |
picUrls.forEach((picUrl, index) => { | |
const row = Math.floor(index / 2); | |
const col = index % 2; | |
sheet.insertImage(picUrl, COL_PICS + col, ROW_PICS + row); | |
}); | |
// Flush changes (does not seem to be required!) | |
SpreadsheetApp.flush(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment