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');

    }
1

There are 1 best solutions below

0
Ben On
  1. In the getSpreadsheetData function, the createDoc function is called but it is not defined in the provided code. You need to define the createDoc function before calling it.

  2. In the createRabies function, there is a reference to templateFile which is not defined in the function. It should be templateFileR instead.