Description:
You can easily create the certificate of each student in a new tab with only one click,using App Script "Power Print"
Explanation Video:
| Previous Step: How to Generate Certificate from Excel Sheet | Next Step: How to save each student certificate as PDF |
Script to add in Google sheet:
/**
* @license MIT
*
* © 2020 xfanatical.com. All Rights Reserved.
*
* @since 1.0.4 fix an issue of numeric value
* @since 1.0.3 fix a bug of #N/A items
* @since 1.0.2 fix a bug of nested formula
* @since 1.0.1 fix a bug of values with spaces
* @since 1.0.0 print all dropdown options from a validation list
*/
function onOpen() {
SpreadsheetApp.getUi()
.createAddonMenu()
.addItem('Expand dropdown', 'expandDropdown')
.addSeparator()
.addItem('Help', 'help')
.addToUi()
}
function help() {
var htmlOutput = HtmlService
.createHtmlOutput('<div style="font-family: Arial, sans-serif;">'
+ '<h3>Quick Start</h3>'
+ '<ul>'
+ ' <li>Select the dropdown cell you\'d like to expand and print</li>'
+ ' <li>Click the menu <b>Add-ons > Power Print > Expand dropdown</b></li>'
+ ' <li>Power Print will export a spreadsheet copy with all dropdown options expanded into separated sheets</li>'
+ ' <li>You may print the spreadsheet copy using Workbook</li>'
+ '</ul>'
+ '<h3>Contact us</h3>'
+ '<p>Please contact <a href="mailto:support@xfanatical.com" target="_blank">support@xfanatical.com</a> if you have problems with this addon.</p>'
+ '</div>')
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Power Print Help')
}
function createSnapshotSpreadsheet(original) {
var currentSpreadsheetName = original.getName()
var today = new Date()
return original.copy(currentSpreadsheetName + '-snapshot-' + today.toLocaleDateString() + '_' + today.toLocaleTimeString())
}
function expandSheets(dropdownRange) {
var dropdownSheetName = dropdownRange.getSheet().getName()
//dropdownRange.getSheet().getName()
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
var snapshotSpreadsheet = createSnapshotSpreadsheet(spreadsheet)
var snapshotDropdownSheet = snapshotSpreadsheet.getSheetByName(dropdownSheetName)
var snapshotDropdownRange = snapshotDropdownSheet.getRange(dropdownRange.getA1Notation())
SpreadsheetApp.setActiveSpreadsheet(snapshotSpreadsheet)
var rule = snapshotDropdownRange.getDataValidation()
if (rule !== null) {
var criteria = rule.getCriteriaType()
var args = rule.getCriteriaValues()
Logger.log('The data validation rule is ' + criteria + ', args = ' + args)
var values
if (criteria === SpreadsheetApp.DataValidationCriteria.VALUE_IN_RANGE) {
Logger.log('value in range, args=' + JSON.stringify(args))
values = args[0].getValues().map(function (val) { return val[0] })
Logger.log('values=' + JSON.stringify(values))
} else if (criteria === SpreadsheetApp.DataValidationCriteria.VALUE_IN_LIST) {
Logger.log('value in list, args=' + JSON.stringify(args))
// eslint-disable-next-line prefer-destructuring
values = args[0]
} else {
SpreadsheetApp.getUi().alert('The range you selected is not a drop down list. Please try again.')
return
}
for (var i = 0; i < values.length; i += 1) {
Logger.log('i=' + i)
var dropdownItemValue = values[i]
if (typeof dropdownItemValue === 'number'
|| (dropdownItemValue.toString().trim() !== '' && dropdownItemValue.toString().trim() !== '#N/A')) {
Logger.log('selecting dropdown value ' + dropdownItemValue)
snapshotDropdownRange.setValue(dropdownItemValue)
SpreadsheetApp.flush()
Logger.log('copying ' + dropdownSheetName + ' [' + dropdownItemValue + '] to ' + snapshotSpreadsheet.getName())
var copySheet = snapshotSpreadsheet.insertSheet(snapshotDropdownSheet.getName() + '-' + dropdownItemValue, {
template: snapshotDropdownSheet,
})
var dataRange = copySheet.getDataRange()
dataRange.setValues(dataRange.getValues())
}
}
// Display a modal dialog box with custom HtmlService content.
var htmlOutput = HtmlService
.createHtmlOutput('<p>A spreadsheet copy including all ' + dropdownSheetName + 's is exported to <a href="' + snapshotSpreadsheet.getUrl() + '" target="_blank">' + snapshotSpreadsheet.getName() + '</a></p><p>You may print the workbook.</p>')
.setWidth(300)
.setHeight(150)
SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Export Successful')
} else {
SpreadsheetApp.getUi().alert('The range you selected is not a dropdown list. Please try again.')
}
}
function expandDropdown() {
var spreadsheet = SpreadsheetApp.getActive()
var activeRange = spreadsheet.getActiveRange()
var dataValidation = activeRange.getDataValidation()
var ui = SpreadsheetApp.getUi()
if (activeRange === null) {
ui.alert('Please select the dropdown list range and try again.')
} else if (dataValidation === null
|| (dataValidation.getCriteriaType() !== SpreadsheetApp.DataValidationCriteria.VALUE_IN_RANGE
&& dataValidation.getCriteriaType() !== SpreadsheetApp.DataValidationCriteria.VALUE_IN_LIST)) {
ui.alert('The range you selected is not a dropdown list. Please try again.')
} else {
var response = ui.alert('Confirm', 'Do you want to print all options in dropdown list of \'' + activeRange.getSheet().getName() + '!' + activeRange.getA1Notation() + '\'?', ui.ButtonSet.YES_NO)
if (response === ui.Button.YES) {
expandSheets(activeRange)
} else {
Logger.log('user cancelled expansion')
}
}
}Feature Tip:
Make sure you are using Google sheet file not Excel sheet file".Xlsx".