Mwsmurf
Mwsmurf

Reputation: 21

GAS Function not setting value as intended in sheet

This is the Google Sheet, it can be copied: https://docs.google.com/spreadsheets/d/1ffIRGiGkiy5WFzSAvWNOY_3cqNXgTAOtO6o8vxS-BFU/edit?usp=sharing

The Function 'AddNewMembers' does not function, even if "isAdded == "No" it will not setValue(recruit_id)

function AddNewMembers(event){
  event = {range: SpreadsheetApp.getActiveRange()}
  CheckHandleSteamIDNotation(event)
  SpreadsheetApp.flush();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var recruitment_log = ss.getSheetByName('RL1');
  var main_roster = ss.getSheetByName('Main Roster');
  var isAdded = recruitment_log.getRange('R3').getValue();
  if(isAdded == "No") {
    var recruit_id = "'" + recruitment_log.getRange('J3').getValue();
    main_roster.getRange('I100').setValue(recruit_id);
  }
}

function CheckHandleSteamIDNotation(event)
{
  let formSheet = SpreadsheetApp.getActiveSheet();
  let header = formSheet.getRange(1,1,1,formSheet.getMaxColumns()).getValues();
  let formRange = formSheet.getRange(formSheet.getLastRow(), 1, 1, formSheet.getMaxColumns());
  let formValues = formRange.getValues();
  for(let i = 0; i < header[0].length; i++)
  {
    if(header[0][i].includes("SteamID"))
    {
      formValues[0][i] = "'" + formValues[0][i];
    }
  }
  formRange.setValues(formValues);
}

Upvotes: 0

Views: 88

Answers (1)

Century Tuna
Century Tuna

Reputation: 1762

Since the provided script above contains var isAdded = recruitment_log.getRange('R3').getValue(); the value of R3 is currently set to "Yes" that is why the condition for the script below is not running.

if(isAdded == "No") {
    var recruit_id = "'" + recruitment_log.getRange('J3').getValue();
    main_roster.getRange('I100').setValue(recruit_id);
  }

Try this modification:

function AddNewMembers(event) {
  event = { range: SpreadsheetApp.getActiveRange() }
  CheckHandleSteamIDNotation(event)
  SpreadsheetApp.flush();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var recruitment_log = ss.getSheetByName('RL1');
  var main_roster = ss.getSheetByName('Main Roster');
  
  //Gets all the data values on recruitment_log
  var isAdded = recruitment_log.getRange(3, 1, recruitment_log.getLastRow(), recruitment_log.getLastColumn()).getValues();
  //Gets the last row starting I17
  var lastrow = main_roster.getRange(17, 9, main_roster.getLastRow() , 1).getValues().filter((x => x > 1)).length
  //Sets the value on the last blank row
  isAdded.map(x => x[17].toString().toLocaleLowerCase() == "no" ? "'" + main_roster.getRange(17 + lastrow,9).setValue(x[9]) : x)

}

I made modifications on your isAdded variable to the following to get the entire range of data on RL1 sheet.

var isAdded = recruitment_log.getRange(3, 1, recruitment_log.getLastRow(), recruitment_log.getLastColumn()).getValues();

This part of script was only used to get the current length of data for the New Operatives. Using .filter() method to filter out empty array elements, since getValues() gets blank cells if there is formatting applied on the spreadsheet.

var lastrow = main_roster.getRange(17, 9, main_roster.getLastRow() , 1).getValues().filter((x => x > 1)).length

Using ES6 .map() method to create a new array for the data that hasn't been added to the main roster sheet file.

isAdded.map(x => x[17].toString().toLocaleLowerCase() == "no" ? "'" + main_roster.getRange(17 + lastrow,9).setValue(x[9]) : x)

Screenshot:

enter image description here

Reference:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter#description

Upvotes: 2

Related Questions