The first function is to create 2 different menu items, the 2nd function is for logging purposes (probably could remove), the 3rd function (getSpreadsheetData) is grabbing the active row and then the CreateDoc function is working but the createRabies function is not...When I run this script I get the error TypeError: Cannot read properties of undefined (reading spreadsheet') but it looks like I've defined it properly, please help! I was hoping the createRabies function could also grab from the getSpreadsheetData function but it seems like I have set it up in such a way that it is not recognizing that function when I run it.
/*
Create menu item to run script from spreadsheet.
*/
function onOpen() {
SpreadsheetApp.getUi()
.createMenu ('Create Docs')
.addItem('Create Discharge', 'getSpreadsheetData')
.addItem('Create Rabies Cert', 'createRabies')
.addToUi();
}
/* Log Events */
function logEvent(action) {
// get the user running the script
var theUser = Session.getActiveUser().getEmail();
// get the relevant spreadsheet to output log details
var ss = SpreadsheetApp.getActiveSpreadsheet();
var logSheet = ss.getSheetByName('Log');
// create and format a timestamp
var dateTime = new Date();
var timeZone = ss.getSpreadsheetTimeZone();
var niceDateTime = Utilities.formatDate(dateTime, timeZone, "MM/dd/yy @ HH:mm:ss");
// create array of data for pasting into log sheet
var logData = [niceDateTime, theUser, action];
// append details into next row of log sheet
logSheet.appendRow(logData);
}
/*Get Spreadsheet data*/
function getSpreadsheetData() {
// Log starting of the script
logEvent('Script has started');
// get current spreadsheet
var spreadsheet = SpreadsheetApp;
var ss = spreadsheet.getActiveSpreadsheet();
// display Toast notification to inform starting of the script
ss.toast('Script has now started', 'Start');
// get Config sheet
var configSheet = ss.getSheetByName('Config');
// get Drive Folder ID for storing created Docs
var destinationFolderId = configSheet.getRange(1, 2).getValue();
Logger.log('destinationFolderId is: ' + destinationFolderId);
// get Drive Folder ID for storing created Rabies Certs
var destinationFolderIdR = configSheet.getRange(3, 2).getValue();
Logger.log('destinationFolderIdR is: ' + destinationFolderIdR);
// get Template Discharge File ID
var templateFileId = configSheet.getRange(2, 2).getValue();
Logger.log('templateFileId is: ' + templateFileId);
// get Template Rabies Cert File ID
var templateFileIdR = configSheet.getRange(4, 2).getValue();
Logger.log('templateFileIdR is: ' + templateFileIdR);
// get Intake sheet
var dataSheet = ss.getActiveSheet();
// get last column number (minus 1 for Google Doc hyperlink column)
var lastCol = dataSheet.getLastColumn() - 1;
// get current row number from active cell where user clicked
var activeCell = dataSheet.getActiveCell();
var currentRowNo = activeCell.getRow();
Logger.log('currentRowNo is: ' + currentRowNo);
// get row data
var data = dataSheet.getRange(currentRowNo, 1, 1, lastCol).getValues();
Logger.log(data);
// create a name:value pair array to send the data to the next Function
var spreadsheetData = {
spreadsheet: spreadsheet,
dataSheet: dataSheet,
destinationFolderId: destinationFolderId,
destinationFolderIdR: destinationFolderIdR,
templateFileId: templateFileId,
templateFileIdR: templateFileIdR,
currentRowNo: currentRowNo,
data: data
};
// run Function to create Google Doc for given row of data
createDoc(spreadsheetData);
}
/*Create Doc*/
function createDoc(spreadsheetData){
SpreadsheetApp.getUi()
// Log starting createDoc Function
logEvent('Starting createDoc Function');
// separate out data from name:value pair array
var spreadsheet = spreadsheetData['spreadsheet'];
var ss = spreadsheet.getActiveSpreadsheet();
var dataSheet = spreadsheetData['dataSheet'];
var destinationFolderId = spreadsheetData['destinationFolderId'];
var templateFileId = spreadsheetData['templateFileId'];
var currentRowNo = spreadsheetData['currentRowNo'];
var data = spreadsheetData['data'];
try {
// try getting the Folder and then set variable as true if successful
var destinationFolder = DriveApp.getFolderById(destinationFolderId);
var gotDestinationFolder = true;
}
catch (e) {
// if failed set variable as false and Log
var gotDestinationFolder = false;
logEvent('Failed to get destinationFolder with error: ' + e.stack);
}
// only proceed if got destination Drive Folder
if (gotDestinationFolder) {
try {
// try getting the Template File and then set variable as true if successful
var templateFile = DriveApp.getFileById(templateFileId);
var gotTemplateFile = true;
}
catch (e) {
var gotTemplateFile = false;
logEvent('Failed to get templateFile with error: ' + e.stack);
}
} else {
// do nothing
};
// only proceed if got Template File also
if (gotDestinationFolder) {
// extract values from array of data
if (data.length != 1) {
throw Error("Row length is not one!")
}
let row = data[0]; // there should be a single entry in the array of arrays
var date = new Date(row[0]).toLocaleDateString();
var dateDue = new Date(row[23]).toLocaleDateString();
var petname = row[10];
var ownername = row[6];
var breed = row[13];
var address = row[9];
var color = row[14];
var gFNumber = row[2];
var age = row[12];
var species = row[3];
var sex = row[11];
var weight = row[15];
var clinic= row[1];
var rabies = row[4];
var vaccine = row[5];
var antiParasitic = row[17];
var dewormer = row[16];
if (row[11] == ""||'') {
throw Error("Sex is not Filled in")
}
if (row[12] == ""||'') {
throw Error("Age is not Filled in")
}
if (row[15] == ""||'') {
throw Error("Weight is not Filled in")
}
if (row[15] == ""||'') {
throw Error("Weight is not Filled in")
}
if (row[18] == ""||'') {
throw Error("Microchip is not Filled in")
}
// create name for new File
var newFileName = gFNumber + ' - ' + ownername + '_' + petname;
// make copy of Template File and place in destination Drive Folder
var newFile = templateFile.makeCopy(newFileName, destinationFolder);
// get ID and Url of new File
var newFileID = newFile.getId();
var newFileUrl = newFile.getUrl();
try {
// try opening the new File, get its Body and then set variable as true if successful
var body = DocumentApp.openById(newFileID).getBody();
var openNewFile = true;
}
catch (e) {
// if failed set variable as false and Log
var openNewFile = false;
logEvent('Failed to open newFileBody with error: ' + e.stack);
}
// only proceed if got Body of new File
if (openNewFile) {
// replace tags with data from sheet
body.replaceText("{Date}", date);
body.replaceText("{DueDate}", dateDue);
body.replaceText("{Pet Name}", petname);
body.replaceText("{Owner Name}", ownername);
body.replaceText("{Breed}", breed);
body.replaceText("{Address}", address);
body.replaceText("{Color}", color);
body.replaceText("{GF Number}", gFNumber);
body.replaceText("{Age}", age);
body.replaceText("{Species}", species);
body.replaceText("{Sex}", sex);
body.replaceText("{Weight}", weight);
body.replaceText("{Clinic}", clinic);
body.replaceText("{Rabies}", rabies);
body.replaceText("{Vaccine}", vaccine);
body.replaceText("{AntiParasitic}", antiParasitic);
body.replaceText("{Dewormer}", dewormer);
// paste a hyperlink to new File in spreadsheet
var newFileLink = '=HYPERLINK("' + newFileUrl + '","' + newFileName + '")';
dataSheet.getRange(currentRowNo, 21).setFormula(newFileLink);
// refresh spreadsheet to links appear as soon as added
spreadsheet.flush();
} else {
// do nothing
};
} else {
// do nothing
};
// display Toast notification to inform end of the script
ss.toast('Script has now ended', 'End');
// Log end of the script
logEvent('Script has ended');
};
//createRabies(spreadsheetData);
//Rabies template docFile ID 1WpSdR-RjX5HPVvj0KOHm6NumUxCCZPyI8QVWNOhxk90
//Rabies Folder 1RBSBAawrU6Zcjhauz1TWMQwSGrZaYE6a
function createRabies(spreadsheetData){
SpreadsheetApp.getUi()
// Log starting createRabies Function
logEvent('Starting createRabies Function');
// separate out data from name:value pair array
var spreadsheet = spreadsheetData['spreadsheet'];
var ss = spreadsheet.getActiveSpreadsheet();
var dataSheet = spreadsheetData['dataSheet'];
var destinationFolderIdR = spreadsheetData['destinationFolderIdR'];
var templateFileIdR = spreadsheetData['templateFileIdR'];
var currentRowNo = spreadsheetData['currentRowNo'];
var data = spreadsheetData['data'];
try {
// try getting the Folder and then set variable as true if successful
var destinationFolderR = DriveApp.getFolderById(destinationFolderIdR);
var gotDestinationFolderR = true;
}
catch (e) {
// if failed set variable as false and Log
var gotDestinationFolderR = false;
logEvent('Failed to get destinationFolderR with error: ' + e.stack);
}
// only proceed if got destination Drive Folder
if (gotDestinationFolderR) {
try {
// try getting the Template Rabies File and then set variable as true if successful
var templateFileR = DriveApp.getFileById(templateFileIdR);
var gotTemplateFileR = true;
}
catch (e) {
var gotTemplateFileR = false;
logEvent('Failed to get templateFileR with error: ' + e.stack);
}
} else {
// do nothing
};
// only proceed if got Template File also
if (gotDestinationFolderR) {
// extract values from array of data
if (data.length != 1) {
throw Error("Row length is not one!")
}
let row = data[0]; // there should be a single entry in the array of arrays
var date = new Date(row[0]).toLocaleDateString();
var petname = row[10];
var ownername = row[6];
var breed = row[13];
var address = row[9];
var color = row[14];
var gFNumber = row[2];
var age = row[12];
var species = row[3];
var sex = row[11];
var weight = row[15];
var rabies = row[4];
var vaccine = row[5];
var microchip = row[18];
if (row[4] == "NO RABIES"||'') {
throw Error("Rabies not given")
}
if (row[11] == ""||'') {
throw Error("Sex is not Filled in")
}
if (row[12] == ""||'') {
throw Error("Age is not Filled in")
}
if (row[15] == ""||'') {
throw Error("Weight is not Filled in")
}
if (row[18] == ""||'') {
throw Error("Microchip is not Filled in")
}
// create name for new File
var newFileName = gFNumber + + " Rabies Cert" +' - ' + ownername + '_' + petname;
// make copy of Template File and place in destination Drive Folder
var newFile = templateFile.makeCopy(newFileName, destinationFolder);
// get ID and Url of new File
var newFileID = newFile.getId();
var newFileUrl = newFile.getUrl();
try {
// try opening the new File, get its Body and then set variable as true if successful
var body = DocumentApp.openById(newFileID).getBody();
var openNewFile = true;
}
catch (e) {
// if failed set variable as false and Log
var openNewFile = false;
logEvent('Failed to open newFileBody with error: ' + e.stack);
}
// only proceed if got Body of new File
if (openNewFile) {
// replace tags with data from sheet
body.replaceText("{Date}", date);
body.replaceText("{Pet Name}", petname);
body.replaceText("{Owner Name}", ownername);
body.replaceText("{Breed}", breed);
body.replaceText("{Address}", address);
body.replaceText("{Color}", color);
body.replaceText("{GF Number}", gFNumber);
body.replaceText("{Age}", age);
body.replaceText("{Species}", species);
body.replaceText("{Sex}", sex);
body.replaceText("{Weight}", weight + "lbs");
body.replaceText("{Rabies}", rabies);
body.replaceText("{Vaccine}", vaccine);
body.replaceText("{Microchip}", microchip);
// paste a hyperlink to new File in spreadsheet
var newFileLink = '=HYPERLINK("' + newFileUrl + '","' + newFileName + '")';
dataSheet.getRange(currentRowNo, 22).setFormula(newFileLink);
// refresh spreadsheet to links appear as soon as added
spreadsheet.flush();
} else {
// do nothing
};
} else {
// do nothing
};
// display Toast notification to inform end of the script
ss.toast('Rabies Script has now ended', 'End');
// Log end of the script
logEvent('Rabies Script has ended');
}
In the
getSpreadsheetDatafunction, thecreateDocfunction is called but it is not defined in the provided code. You need to define thecreateDocfunction before calling it.In the
createRabiesfunction, there is a reference totemplateFilewhich is not defined in the function. It should betemplateFileRinstead.