简体   繁体   中英

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

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:

在此处输入图像描述

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM