Skip to content

Instantly share code, notes, and snippets.

@misterfresh
Last active June 3, 2020 13:05
Show Gist options
  • Save misterfresh/e1c9cf0bb4c777221f84 to your computer and use it in GitHub Desktop.
Save misterfresh/e1c9cf0bb4c777221f84 to your computer and use it in GitHub Desktop.
Add an Update button to the Dashboard for React Drive CMS
// This script is intended for use with https://github.com/misterfresh/react-drive-cms
// Add it as a bound script to the Dashboard Sheet file
function onOpen() {
var dashboard = SpreadsheetApp.getActiveSpreadsheet();
var updateDashboard = [{name: "Update Dashboard", functionName: "prepareSheets"}];
dashboard.addMenu("Update", updateDashboard);
}
function prepareSheets() {
var Preparator = {
projectFolderName: 'DriveCMS',
activeSpreadsheet: SpreadsheetApp.getActiveSpreadsheet(),
postsFolderName: 'Posts',
dashboardSpreadsheetName: 'Dashboard',
imagesFolderName: 'Images',
previousPostsData: {},
run: function () {
var self = this;
self.setFiles();
self.getPostsData();
self.getImagesData();
self.savePostsData();
self.resetSheets();
self.prepareImagesRange();
self.populateDashboard();
//self.hideInternal();
self.activeSpreadsheet.setActiveSheet(self.postsSheet)
},
setFiles: function () {
var self = this;
self.folders = DriveApp.getFoldersByName(self.projectFolderName);
self.projectFolder = self.folders.next();
var projectFiles = self.projectFolder.getFiles();
while (projectFiles.hasNext()) {
var file = projectFiles.next();
Logger.log(file.getName());
switch (file.getName()) {
case self.dashboardSpreadsheetName:
self.dashboardFile = file;
break;
case self.categoriesSpreadsheetName:
self.categoriesFile = file;
break;
}
}
var subFolders = self.projectFolder.getFolders();
while (subFolders.hasNext()) {
var folder = subFolders.next();
Logger.log(folder.getName());
switch (folder.getName()) {
case self.postsFolderName:
self.postsFolder = folder;
break;
case self.imagesFolderName:
self.imagesFolder = folder;
break;
}
}
},
getPostsData: function () {
var self = this;
self.postsData = [];
var posts = self.postsFolder.getFiles();
while (posts.hasNext()) {
var post = posts.next();
self.postsData.push(
{
id: post.getId(),
title: post.getName(),
lastUpdated: post.getLastUpdated()
}
);
}
self.postCount = self.postsData.length;
},
savePostsData: function () {
var self = this;
var postsSheet = self.activeSpreadsheet.getSheetByName(self.postsFolderName);
if (postsSheet != null) {
var postsDataLength = postsSheet.getLastRow();
if (postsDataLength > 1) {
var postsData = {};
for (var k = 2; k <= postsDataLength; k++) {
postsData[postsSheet.getRange(k, 5).getValue()] = {
subtitle: postsSheet.getRange(k, 2).getValue(),
category: postsSheet.getRange(k, 3).getValue(),
imageName: postsSheet.getRange(k, 4).getValue(),
imageId: postsSheet.getRange(k, 6).getValue()
};
}
self.previousPostsData = postsData
}
}
},
resetSheets: function () {
var self = this;
var firstSheet = self.activeSpreadsheet.getSheets()[0];
var secondSheet = self.activeSpreadsheet.getSheets()[1];
var thirdSheet = self.activeSpreadsheet.getSheets()[2];
firstSheet.clear();
firstSheet.setName(self.postsFolderName);
firstSheet.getRange("A1:G1").setValues([["Title", "Subtitle", "Category", "Image", "Post Id", "Image Id", "Last Updated"]]);
if (secondSheet != null) {
secondSheet.clear();
} else {
secondSheet = self.activeSpreadsheet.insertSheet();
}
secondSheet.setName(self.imagesFolderName);
secondSheet.getRange("A1:C1").setValues([["Title", "Available", "Image Id"]]);
if (thirdSheet != null) {
self.activeSpreadsheet.deleteSheet(thirdSheet);
}
self.postsSheet = firstSheet;
self.imagesSheet = secondSheet;
},
getImagesData: function () {
var self = this;
self.imagesData = [];
var images = self.imagesFolder.getFiles();
while (images.hasNext()) {
var image = images.next();
self.imagesData.push(
{
id: image.getId(),
title: image.getName()
}
);
}
self.imagesCount = self.imagesData.length;
},
prepareImagesRange: function () {
var self = this;
// images are inserted in the sheet
for (var j = 0; j < self.imagesData.length; j++) {
if (typeof self.imagesData[j] === 'undefined') {
continue;
}
var imagesDat = self.imagesData[j];
self.imagesSheet.appendRow([imagesDat['title'], 1, imagesDat['id']]);
}
var lastRow = self.imagesSheet.getLastRow();
self.imageRangeA1 = "A2:C" + lastRow;
self.imageRange = self.imagesSheet.getRange(self.imageRangeA1);
self.imageRange.sort(1);
self.imageNamesRange = self.imagesSheet.getRange(2, 1, lastRow);
self.imagesRule = SpreadsheetApp.newDataValidation().setAllowInvalid(true).requireValueInRange(self.imageNamesRange, true).build()
},
populateDashboard: function () {
var self = this;
//remaining posts are inserted in the sheet
for (var j = 0; j < self.postsData.length; j++) {
if (typeof self.postsData[j] === 'undefined') {
continue;
}
var postDat = self.postsData[j];
var subtitle = '', category = '', imageName = '', imageId = '';
var previousPost = self.previousPostsData[postDat['id']];
if (previousPost) {
subtitle = previousPost.subtitle || '';
category = previousPost.category || '';
imageName = previousPost.imageName || '';
imageId = previousPost.imageId || '';
}
self.postsSheet.appendRow([postDat['title'], subtitle, category, imageName, postDat['id'], imageId, postDat['lastUpdated']]);
var postRow = self.postsSheet.getRange(j + 2, 1, 1, 7);
var imageCell = postRow.getCell(1, 4);
imageCell.setDataValidation(self.imagesRule);
postRow.getCell(1, 6).setFormula("=VLOOKUP(" + imageCell.getA1Notation() + ';' + 'Images!' + self.imageRangeA1 + ';' + 3 + ")");
}
},
hideInternal: function () {
var self = this;
self.postsSheet.hideColumns(5, 3);
self.imagesSheet.hideSheet();
}
};
Preparator.run();
}
@therrou
Copy link

therrou commented May 26, 2020

Hello Antoine, how are you? Good evening. My name is Tomas, I'm working as a Junior Frontend Developer in a little Start Up. I showed your project to the founder and he loves the system to upload posts, but I have a lot of complications for implement in our current React site. Can I make you a few questions? my email: tomvcp@gmail.com

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment