Search code examples
htmlbuttongoogle-apps-scriptonclickhref

GAS - Button in script gadget runs target script, then disappears


I'm trying to create a time-tracking tool on Google Sites for my coworkers to log their hours, with the following needs:

- 3 buttons: One to log a timestamp, one to tally up logs, and one to view a logsheet.
- all users can see button 1, only specific email addresses can see boxes 2 & 3.
- When button 1 is pressed, logging script is run and gadget returns to button, so user can press again.

I have created the below Google Appscript to draw the buttons in a Gadget IEFrame, run the timestamp script on click, and ideally return the user's attention back to the button.

My problem is that, after clicking the button in the appscript gadget, the script runs fine, but the gadget area turns blank. I have to refresh the page to get the button back. I've tried ending the script by reloading the HTML document, but the OutputToHTMLFile command doesn't seem to work the last time I run it, even though it runs ok when the page is first loaded. Is there a way to run the script without the buttons disappearing?

Here is how the issue looks on my test site:

Image of button Disappearance

SendtoLog Script:

  function doGet() {
  var e = Session.getActiveUser().getEmail();
  if( /*e == "user1@email.com" ||*/
  e == "user2@email.com" ||
  e == "user3@email.com")
  {
     return HtmlService.createHtmlOutputFromFile('adminButtons');
  }

  else
  {
   return HtmlService.createHtmlOutputFromFile('callerButtons');
  }
 }

function sendToLog(e) {
 var email = Session.getActiveUser().getEmail(); // Get current user 
 var now = new Date(); //Pull login time for user   
 var nowMinute 
 var currentDate = now;
 //open spreadsheet for tracking and open the sheet for the current user
 var folderID = openFolderByName("TimeTrack");
 var folderToWrite = DriveApp.getFolderById(folderID);
 var logSheetID = openFileByName ("Logsheet");
 var logSheet = SpreadsheetApp.openById(logSheetID);

 try{logSheet.setActiveSheet(logSheet.getSheetByName("Sheet1"));
   logSheet.deleteActiveSheet();}
 catch (e){Logger.log("Sheet1 is already deleted")};

 try{logSheet.setActiveSheet(logSheet.getSheetByName(email));}
 catch (e) {logSheet.insertSheet(email);}  

 try{logSheet.setActiveSheet(logSheet.getSheetByName("Sheet1"));
   logSheet.deleteActiveSheet();}
 catch (e){Logger.log("Sheet1 is already deleted")};

 //get last row of the sheet so we can check what was done on the last click
 var lastRow = logSheet.getLastRow();
 if (lastRow < 1) // If there is no data on the sheet, this will be our first logon
 var logType = "logon"; //We will assume that current logon event is a logon unless noted otherwise on spreadsheet.

  else 
  {
   var dataRange = "A1:B"+ lastRow; 
    var dataWithoutHeaders = logSheet.getRange(dataRange).getValues() // Pull data from the sheet for comparison
   var lastLogType = logSheet.getRange("C"+lastRow).getDisplayValue(); //     Pull the description of the last log event 
    //if last row is login, add logoff, otherwise, add logon.
    switch(lastLogType){
    case "logon":
    var logType = "logoff";
    break;
    case "logoff":
    var logType = "logon";
    break;
    default:
    var logType = "Logon"; //We will assume if last entry could not be compared, this is a logon event.
    break;
  }//End switch
 }//End else statement   
 logSheet.appendRow([email, currentDate, logType]); //Write email, time stamp, and log event to sheet 
 var e = Session.getActiveUser().getEmail();  
 if( /*e == "user1@mail.com" ||*/
  e == "user2@mail.com" ||
  e == "user3@email.com")
  {
  return HtmlService.createHtmlOutputFromFile('adminButtons');
  }  
 else
 {
  return HtmlService.createHtmlOutputFromFile('callerButtons');
 }
}//end function SendtoLog
function openFileByName (FileNameString)
{
var FileIterator = DriveApp.getFilesByName(FileNameString);
while (FileIterator.hasNext())
{
var file = FileIterator.next();
if (file.getName() == FileNameString)
 {
  var sheet = SpreadsheetApp.open(file);
  var sheetID = sheet.getId();      
 }    
}
return sheetID;
}
function openFolderByName (FolderNameString)
{  
 var FolderIterator = DriveApp.getFoldersByName(FolderNameString);
 var folderFound = false;
 while (FolderIterator.hasNext() || !folderFound)
 {
  var folder = FolderIterator.next();      
  if (folder.getName() == FolderNameString)
 {
 folderFound = true;
 var folderID = folder.getId(); 
 }       
}
return folderID;
}

callerButtons HTML Page:

<div style="display:block;text-align:left"><input type="button" onclick="location.href='https://script.google.com/a/macros/mycompany.com/s/AKfycbwM842S-Y6Y18sDV7p0fZlb9LqdP6juXcMz1QFa4s6-h4w/exec';" value="Time Check-In" />

adminButtons HTML Page:

<div style="display:block;text-align:left"><input type="button" onclick="location.href='https://script.google.com/a/macros/mycompany.com/s/AKfycbwM842S-Y6Y18sDV7p0fZlb9LqdP6jueL7bXcMz1QFa4s6-h4w/exec';" value="Time Check-In" />

<br>
<div style="display:block;text-align:left"><input type="button" onclick="location.href='https://script.google.com/a/macros/mycompany.com/s/AKfycbwM842S-Y67p0fZlb9LqdP6jueL7bXcMz1QFa4s6-h4w/exec';" value="Tabulate Times" />

<br>
<div style="display:block;text-align:left"><input type="button" onclick="location.href='https://script.google.com/a/macros/mycompany.com/s/AKfycbwM842S-Y6Y18sDV7p0fZlb9LqdP6jueL7bXcMz1QFa44w/exec';" value="CSV Folder" />

Solution

  • OK, so this was a question from someone who didn't even know how to open a developer's console to troubleshoot. For others wondering how to check Javascript code in Chrome, press CTRL+SHIFT+I.

    It turns out one of my variables was a broken reference in one of the onclick functions. All fixed!