Reputation: 314
I try to make a script to get feedback of a validator, to check if the input an IP addresses is.
cell ' ip!I12 ' named ' REGEXP_IP_pattern ' :
^((((25[0-5])|(2[0-4][0-9])|([01]?[0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|([01]?[0-9]{1,2})))
reg exp demo : https://regexr.com/54fon - works fine (in the formula)
works in the formula fine, but I have to work with formulas in formulas to define if the status is valid or not.
The regular expression in formula format works fine [see worksheet 'ip
'], but the sad thing is that I fail to get it working in the script.
Have some issues to retrieve the correct and good information, to define if a input 'ip' is valid or not. (see column 'input' , 'good ip')
in the formula :
=IF( REGEXREPLACE(TRIM( <cell> &"");REGEXP_IP_pattern;wildChar_IP) = wildChar_IP;1;0)
TRIM( <cell> &"")
wildChar_IP
' [a wild character]wildChar_IP
')For the Google Apps Script, TOOLS > SCRIPT EDITOR
To see the output of the logger : VIEW > LOGBOOK
So how is it possible to get feedback, status, if it only matches with regular expression in a function?
for example a boolean as return.
This is my code ... but fails to define when it really matches. Because of autosense/autocomplete is not really reliable, is there an other way to find out all method of
var regExp = new RegExp(regExpPattIP, "gi");
var result01 = regExp.exec(ip01);
code :
var ip01 ='256.12.2.0'
var ip02 ='255.12.2.0'
var ip03 ='192.168..1'
var ip04 ='10.12.12.12.12'
var ip05 ='010.060.090.002'
function validatorRegExp() {
//var regExpPattIP ="^((((25[0-5])|(2[0-4][0-9])|([01]?[0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|([01]?[0-9]{1,2})))";
var regExpPattIP = actSheet.getRangeByName(RegExp_patt_IP).getValue();
var regExp = new RegExp(regExpPattIP, "gi"); // "i" is for case insensitive -- "g" is for global
var result01 = regExp.exec(ip01);
console.log(" --- ip01: ", ip01, "---");
console.log(result01);
var result02 = regExp.exec(ip02);
console.log(" --- ip02: ", ip02, "---");
console.log(result02);
var result03 = regExp.exec(ip03);
console.log(" --- ip03: ", ip03, "---");
console.log(result03);
var result04 = regExp.exec(ip04);
//var result04B = regExp.exec(ip04)[1]; // null - PROBLEM
console.log(" --- ip04: ", ip04, "---");
console.log(result04);
// console.log(result04B);
console.log(" --- ip05: ", ip05, "---");
var result05 = regExp.exec(ip05);
var result05B = regExp.exec(ip05)[1];
console.log(result05);
console.log(result05B);
}
RESULT
[20-05-12 23:54:45:052 CEST] --- ip01: 256.12.2.0 ---
[20-05-12 23:54:45:054 CEST] null
[20-05-12 23:54:45:056 CEST] --- ip02: 255.12.2.0 ---
[20-05-12 23:54:45:058 CEST] [ '255.12.2.0',
'255.12.2.0',
'2.',
'2',
undefined,
undefined,
'2',
'0',
undefined,
undefined,
'0',
index: 0,
input: '255.12.2.0',
groups: undefined ]
[20-05-12 23:54:45:060 CEST] --- ip03: 192.168..1 ---
[20-05-12 23:54:45:061 CEST] null
[20-05-12 23:54:45:063 CEST] --- ip04: 10.12.12.12.12 --- ****** is bad
[20-05-12 23:54:45:064 CEST] [ '10.12.12.12',
'10.12.12.12',
'12.',
'12',
undefined,
undefined,
'12',
'12',
undefined,
undefined,
'12',
index: 0,
input: '10.12.12.12.12',
groups: undefined ]
[20-05-12 23:54:45:066 CEST] --- ip05: 010.060.090.002 ---
[20-05-12 23:54:45:068 CEST] null
[20-05-12 23:54:45:069 CEST] 010.060.090.002
If you think a 'valid' feature would be helpfull, vote up here : https://issuetracker.google.com/issues/36762591
And the idea is then make it visual by 'conditional formatting' (https://developers.google.com/sheets/api/guides/conditional-format#apps-script)
All Help is more then welcome.
formula and script:
https://drive.google.com/open?id=1HTgdC6Ss8oOvwVm86kbOdlt5jX8UyVmd-Eyo-oWhEGw
(only read access, if you want to test/check it out make a copy)
REMARK : (continued) How can I dynamically apply a regular expression on change of a cell or in conditional format?
Google Apps Script; using Regular Expression on a dynamic way implemented, on change of a cell or in conditional format.
Upvotes: 1
Views: 1483
Reputation: 201438
I believe your goal as follows.
For this, how about this answer?
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
is used. Reftest()
for this.The sample script is as follows. In this case, it supposes that there are the IP addresses in the column "A". And the output value is put to the column "B".
function myFunction() {
const regExpPattIP = '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$';
const regExp = new RegExp(regExpPattIP);
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
const range = sheet.getRange("A1:A" + sheet.getLastRow());
const values = range.getDisplayValues();
var res = values.map(([e]) => ([regExp.test(e.trim())]));
range.offset(0, 1).setValues(res);
}
When the following modification is reflected to above sample script, the cell color of the valid IP address is changed.
From
var res = values.map(([e]) => ([regExp.test(e.trim())]));
range.offset(0, 1).setValues(res);
To
var colors = values.map(([e]) => ([regExp.test(e.trim()) ? "green" : null]));
range.setBackgrounds(colors);
When above script is run, the following result is obtained. I used your sample IP addresses at the column "A". The result is put to the column "B".
Upvotes: 2