Search code examples
google-apps-scriptinserttry-catchrowsetvalue

setValues not working after try/catch statement in Google Apps Script


My Google Apps Script code finds a particular sheet, or creates it if it doesn't exist; it then adds a new row of data underneath the header. When it has to create a new sheet, I want to set up the header line, but it won't work where it's supposed to, and I don't understand why. This code works as is, but you can see where I want to move my line of code. Any help is appreciated.

// for each work order
for (var i = headerCount; i < data.length; i++) {
  var workOrder = data[i][workOrderColumn];
  var inspector = data[i][inspectorColumn];

  // find or create sheet in logSpreadsheet
  var logSheet = logSpreadsheet.getSheetByName(workOrder);
  if(logSheet == null) {

    try {
      logSheet = logSpreadsheet.insertSheet(workOrder);
    } catch(e) {
      Logger.log(e);
      continue;
    }

    //This is where I want this line to be, but it doesn't work here:
    //logSheet.getRange("A1:B1").setValues([["Date", "Inspector"]]);
  }

  // log data
  logSheet.insertRows(1);
  logSheet.setFrozenRows(1);

  //Here, the code works, but it shouldn't be here (it only needs to happen when the sheet is created)
  logSheet.getRange("A1:B1").setValues([["Date", "Inspector"]]);
  logSheet.getRange("A2:B2").setValues([[date, inspector]]);
}

Solution

  • The reason for your code not working is because of this set of circumstances.

    logSheet.getRange("A1:B1").setValues([["Date", "Inspector"]]);
    //The above line adds the header to row one
    logSheet.insertRows(1);
    //The above code inserts a new line at row 1
    //That so header line is effectively in row 2 ("A2:B2")
    

    So later in the code when you set the value of ("A2:B2") like so

    logSheet.getRange("A2:B2").setValues([[date, inspector]]);
    

    in overwrites the header values.

    I would make the following modification

    logSheet.insertRows(2); // or remove this code
    

    Your final code:

    for (var i = headerCount; i < data.length; i++) {
      var workOrder = data[i][workOrderColumn];
      var inspector = data[i][inspectorColumn];
    
      // find or create sheet in logSpreadsheet
      var logSheet = logSpreadsheet.getSheetByName(workOrder);
      if(logSheet == null) {
    
        try {
          logSheet = logSpreadsheet.insertSheet(workOrder);
        } catch(e) {
          Logger.log(e);
          continue;
        }
    
        logSheet.getRange("A1:B1").setValues([["Date", "Inspector"]]);
        logSheet.setFrozenRows(1);
      }
    
      logSheet.insertRows(2);
    
    
      //Here, the code works, but it shouldn't be here (it only needs to happen when the sheet is created)
      //logSheet.getRange("A1:B1").setValues([["Date", "Inspector"]]);
      logSheet.getRange("A2:B2").setValues([[date, inspector]]);
    }