Skip to content

Instantly share code, notes, and snippets.

@ttsukagoshi
Last active June 1, 2020 02:39
Show Gist options
  • Save ttsukagoshi/edcad0a1ae07dbd21acaf8d63935ca30 to your computer and use it in GitHub Desktop.
Save ttsukagoshi/edcad0a1ae07dbd21acaf8d63935ca30 to your computer and use it in GitHub Desktop.
Create Google Spreadsheet sheet(s) from set(s) of header and value
/**
* Create Google Spreadsheet sheet(s) from set(s) of header and value
*
* @param {Object} spreadsheet - Spreadsheet object to create sheet on
* @param {Array} dataSet - Array of formatted object containing data object(s) which should be in form of
* [
* {'sheetName':{string}'sheetName0', 'sheetData':{Array}dataObject0},
* {'sheetName':{string}'sheetName1', 'sheetData':{Array}dataObject1},...
* ]
* @param {string} prefix - Optional. Prefix to be added to title of each sheet.
* @param {Date} timestamp - Optional. Timestamp of dataSet; defaults to the time when script is executed.
* @return {Array} createdSheets - Array of sheets created in form of [{sheetId0=sheetName0},{sheetId1=sheetName1}, ...]
*/
function createSheets_(spreadsheet, dataSet, prefix = '', timestamp = new Date()) {
let createdSheets = [];
for (let i = 0; i < dataSet.length; ++i) {
let createdSheet = {};
let dataObject = dataSet[i];
let sheetName = dataObject.sheetName;
let sheetData = dataObject.sheetData;
let sheetTitle = `${prefix} - ${sheetName} as of ${Utilities.formatDate(timestamp, timeZone, "yyyy-MM-dd'T'HH:mm:ssXXX")}`;
let sheet = spreadsheet.insertSheet(sheetName, i); // Insert new sheet to spreadsheet
// Enter sheet title
sheet.getRange(1, 1).setValue(sheetTitle);
if (sheetData.length == 0) {
sheet.getRange(3, 1).setValue('No Data Available'); // Header Message
} else {
// Breakdown object sheetData into its header and values; see function breakdownObject for details
let sheetDataElem = breakdownObject_(sheetData);
let sheetDataHeader = sheetDataElem[0]; // note that sheetDataHeader is already a two-dimensional array
let sheetDataValues = sheetDataElem[1];
// Enter into sheet
sheet.getRange(3, 1, 1, sheetDataHeader[0].length).setValues(sheetDataHeader); // Header
sheet.getRange(4, 1, sheetDataValues.length, sheetDataHeader[0].length).setValues(sheetDataValues); // Values
}
createdSheet[sheet.getSheetId()] = sheetName;
createdSheets.push(createdSheet);
}
return createdSheets;
}
/**
* Converts the input array of object into array of keys, i.e.,header, and its values
*
* @param {Array} data - array of objects
* @return {Array} output - array of [header, values], where header and values are both two-dimensional arrays
*/
function breakdownObject_(data) {
let header = [];
let values = [];
let keys = Object.keys(data[0]);
let key = '';
// define header
header[0] = keys;
// define values
for (let i = 0; i < data.length; ++i) {
let datum = data[i];
values[i] = [];
for (let j = 0; j < keys.length; ++j) {
key = keys[j];
values[i].push(datum[key]);
}
}
let output = [header, values];
return output;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment