Why does EvaluateJavaScript return null?

Hi, Scriptable and JS newb here.

I’m writing a simple HTML table parser that uses document.getElementsByTagName so I’m executing via WebView and Evaluatejavascript. From the Scriptable documentation, I expected to have the table of data returned by Evaluatejavascript, but instead I get a null. I’ve verified the contents of the table via the log written from inside the Evaluatejavascript. I’ve tried to return the table in array form and JSON.stringify() form.

let url = "https://www.collegeswimming.com/recruiting/rankings/2016/M/"
let wv = new WebView()
await wv.loadURL(url)
let js = `
var tblData = new Array();
var rows = document.getElementsByTagName("tr");
for(var cnt = 1; cnt < rows.length; cnt++) {
    var cells = rows[cnt].getElementsByTagName("td");
    var row = [];
for (var count = 0; count < cells.length; count++) {
    row.push(cells[count].innerText.trim());
    }    
    tblData.push(row);
}
log("in WebView - tblData" + tblData);
// let tblString = JSON.stringify(tblData);
`
let tblTemp = await wv.evaluateJavaScript(js);
let tblArray = JSON.parse(tblTemp)
log(tblTemp)
log(tblArray)

What am I missing?

Your not returning anything from the evaluated JavaScript. Try this at the end of the evaluates script add this line:

tblData;

This will return the value of tblData.

1 Like

I had this with your commented web view JS line uncommented. I amended the logging a little to test with (results below).

let url = "https://www.collegeswimming.com/recruiting/rankings/2016/M/"
let wv = new WebView()
await wv.loadURL(url)
let js = `
var tblData = new Array();
var rows = document.getElementsByTagName("tr");
for(var cnt = 1; cnt < rows.length; cnt++) {
    var cells = rows[cnt].getElementsByTagName("td");
    var row = [];
for (var count = 0; count < cells.length; count++) {
    row.push(cells[count].innerText.trim());
    }    
    tblData.push(row);
}
log("in WebView - tblData: " + tblData);
let tblString = JSON.stringify(tblData);
tblString;
`
let tblTemp = await wv.evaluateJavaScript(js);
log(tblTemp);

let tblArray = JSON.parse(tblTemp);
log(tblArray);
log(tblArray[0]);
Expand here to view script run results
2019-03-24 20:50:51: in WebView - tblData: 1,Michael Andrew,–,Lawrence, KS,1.00,1,James Murphy,,clifton, VA,1.00,1,Dean Farris,,Atlanta, GA,1.00,1,Maxime Rooney,,Livermore, CA,1.00,5,Michael Jensen,,Dresher, PA,1.05,6,aukai Lileikis,,Honolulu, HI,1.07,7,Thomas Anderson,,Federal Way, WA,1.08,8,Mark Jurek,,Gilbert, AZ,1.09,8,Cameron Craig,,Monroe, MI,1.09,8,Ted Schubert,,Richmond, VA,1.09,8,Grant Shoults,,Laguna Hills, CA,1.09,12,Tommy Cope,,Dayton, OH,1.11,13,William Macmillan,,Chapel Hill, NC,1.13,14,Felix Auboeck,,Bad Voeslau, AUT,1.17,15,Daniel Hein,,Sycamore, IL,1.18,15,True Sweetser,,Ocala, FL,1.18,17,Gergely GYURTA,–,HUN,1.19,18,Gregory Brocato,,Ambler, PA,1.20,18,Andreas VAZAIOS,,Athens, GRE,1.20,20,Joe Molinari,,redwood city, CA,1.21,20,Mark McGlaughlin,,Iowa City, IA,1.21,22,Aaron Schultz,,Richmond, VA,1.24,23,Benjamin Ho,,Los Altos, CA,1.30,24,Raiz Tjon-A-Joe,,Paramaribo, SUR,1.33,25,Nick Alexander,,St. Louis, MO,1.35,26,Benjamin Walker,,The Woodlands, TX,1.37,26,Jacob Montague,,Grosse Pointe Farms, MI,1.37,28,Taylor Abbott,,Cedar Park, TX,1.38,28,Jeremy Babinet,,Redwood City, CA,1.38,28,Daniel Chang,,Johnson City, TN,1.38,31,Xiangfei Xie,,Saratoga, CA,1.51,32,Charlie Swanson,,Richmond, VA,1.54,32,Javier Acevedo,,Scarborough, ON,1.54,34,Daniel Erlenmeyer,,Bradenton, FL,1.55,35,Zheng Quah,,Singapore, SIN,1.59,36,Andrea Vergani,,Milano, ITA,1.62,36,Liam O'Haimhirgin,,Fair Oaks, CA,1.62,38,Ruben Leeuwen,–,Eindhoven, NED,1.67,39,Max Polianski,,Auckland, NZL,1.68,40,Tyler Rice,,Jacksonville, FL,1.71,40,Albert Gwo,,Mountain View, CA,1.71,40,Khader Baqlah,,Amman, JOR,1.71,43,Drew Clark,,Sarasota, FL,1.73,43,James Jones,,Fairfax, VA,1.73,45,Ethan Young,,Dalton, GA,1.74,46,Cooper Hodge,,Cincinnati, OH,1.76,46,Nazareno Boscaino,,Tampa, FL,1.76,46,Ryan Baker,,Arlington, VA,1.76,46,Pawel Sendyk,,Szczecin, POL,1.76,50,Walker Higgins,,Knoxville, TN,1.77
2019-03-24 20:50:51: [["1","Michael Andrew","–","Lawrence, KS","1.00"],["1","James Murphy","","clifton, VA","1.00"],["1","Dean Farris","","Atlanta, GA","1.00"],["1","Maxime Rooney","","Livermore, CA","1.00"],["5","Michael Jensen","","Dresher, PA","1.05"],["6","aukai Lileikis","","Honolulu, HI","1.07"],["7","Thomas Anderson","","Federal Way, WA","1.08"],["8","Mark Jurek","","Gilbert, AZ","1.09"],["8","Cameron Craig","","Monroe, MI","1.09"],["8","Ted Schubert","","Richmond, VA","1.09"],["8","Grant Shoults","","Laguna Hills, CA","1.09"],["12","Tommy Cope","","Dayton, OH","1.11"],["13","William Macmillan","","Chapel Hill, NC","1.13"],["14","Felix Auboeck","","Bad Voeslau, AUT","1.17"],["15","Daniel Hein","","Sycamore, IL","1.18"],["15","True Sweetser","","Ocala, FL","1.18"],["17","Gergely GYURTA","–","HUN","1.19"],["18","Gregory Brocato","","Ambler, PA","1.20"],["18","Andreas VAZAIOS","","Athens, GRE","1.20"],["20","Joe Molinari","","redwood city, CA","1.21"],["20","Mark McGlaughlin","","Iowa City, IA","1.21"],["22","Aaron Schultz","","Richmond, VA","1.24"],["23","Benjamin Ho","","Los Altos, CA","1.30"],["24","Raiz Tjon-A-Joe","","Paramaribo, SUR","1.33"],["25","Nick Alexander","","St. Louis, MO","1.35"],["26","Benjamin Walker","","The Woodlands, TX","1.37"],["26","Jacob Montague","","Grosse Pointe Farms, MI","1.37"],["28","Taylor Abbott","","Cedar Park, TX","1.38"],["28","Jeremy Babinet","","Redwood City, CA","1.38"],["28","Daniel Chang","","Johnson City, TN","1.38"],["31","Xiangfei Xie","","Saratoga, CA","1.51"],["32","Charlie Swanson","","Richmond, VA","1.54"],["32","Javier Acevedo","","Scarborough, ON","1.54"],["34","Daniel Erlenmeyer","","Bradenton, FL","1.55"],["35","Zheng Quah","","Singapore, SIN","1.59"],["36","Andrea Vergani","","Milano, ITA","1.62"],["36","Liam O'Haimhirgin","","Fair Oaks, CA","1.62"],["38","Ruben Leeuwen","–","Eindhoven, NED","1.67"],["39","Max Polianski","","Auckland, NZL","1.68"],["40","Tyler Rice","","Jacksonville, FL","1.71"],["40","Albert Gwo","","Mountain View, CA","1.71"],["40","Khader Baqlah","","Amman, JOR","1.71"],["43","Drew Clark","","Sarasota, FL","1.73"],["43","James Jones","","Fairfax, VA","1.73"],["45","Ethan Young","","Dalton, GA","1.74"],["46","Cooper Hodge","","Cincinnati, OH","1.76"],["46","Nazareno Boscaino","","Tampa, FL","1.76"],["46","Ryan Baker","","Arlington, VA","1.76"],["46","Pawel Sendyk","","Szczecin, POL","1.76"],["50","Walker Higgins","","Knoxville, TN","1.77"]]
2019-03-24 20:50:51: [["1","Michael Andrew","–","Lawrence, KS","1.00"],["1","James Murphy","","clifton, VA","1.00"],["1","Dean Farris","","Atlanta, GA","1.00"],["1","Maxime Rooney","","Livermore, CA","1.00"],["5","Michael Jensen","","Dresher, PA","1.05"],["6","aukai Lileikis","","Honolulu, HI","1.07"],["7","Thomas Anderson","","Federal Way, WA","1.08"],["8","Mark Jurek","","Gilbert, AZ","1.09"],["8","Cameron Craig","","Monroe, MI","1.09"],["8","Ted Schubert","","Richmond, VA","1.09"],["8","Grant Shoults","","Laguna Hills, CA","1.09"],["12","Tommy Cope","","Dayton, OH","1.11"],["13","William Macmillan","","Chapel Hill, NC","1.13"],["14","Felix Auboeck","","Bad Voeslau, AUT","1.17"],["15","Daniel Hein","","Sycamore, IL","1.18"],["15","True Sweetser","","Ocala, FL","1.18"],["17","Gergely GYURTA","–","HUN","1.19"],["18","Gregory Brocato","","Ambler, PA","1.20"],["18","Andreas VAZAIOS","","Athens, GRE","1.20"],["20","Joe Molinari","","redwood city, CA","1.21"],["20","Mark McGlaughlin","","Iowa City, IA","1.21"],["22","Aaron Schultz","","Richmond, VA","1.24"],["23","Benjamin Ho","","Los Altos, CA","1.30"],["24","Raiz Tjon-A-Joe","","Paramaribo, SUR","1.33"],["25","Nick Alexander","","St. Louis, MO","1.35"],["26","Benjamin Walker","","The Woodlands, TX","1.37"],["26","Jacob Montague","","Grosse Pointe Farms, MI","1.37"],["28","Taylor Abbott","","Cedar Park, TX","1.38"],["28","Jeremy Babinet","","Redwood City, CA","1.38"],["28","Daniel Chang","","Johnson City, TN","1.38"],["31","Xiangfei Xie","","Saratoga, CA","1.51"],["32","Charlie Swanson","","Richmond, VA","1.54"],["32","Javier Acevedo","","Scarborough, ON","1.54"],["34","Daniel Erlenmeyer","","Bradenton, FL","1.55"],["35","Zheng Quah","","Singapore, SIN","1.59"],["36","Andrea Vergani","","Milano, ITA","1.62"],["36","Liam O'Haimhirgin","","Fair Oaks, CA","1.62"],["38","Ruben Leeuwen","–","Eindhoven, NED","1.67"],["39","Max Polianski","","Auckland, NZL","1.68"],["40","Tyler Rice","","Jacksonville, FL","1.71"],["40","Albert Gwo","","Mountain View, CA","1.71"],["40","Khader Baqlah","","Amman, JOR","1.71"],["43","Drew Clark","","Sarasota, FL","1.73"],["43","James Jones","","Fairfax, VA","1.73"],["45","Ethan Young","","Dalton, GA","1.74"],["46","Cooper Hodge","","Cincinnati, OH","1.76"],["46","Nazareno Boscaino","","Tampa, FL","1.76"],["46","Ryan Baker","","Arlington, VA","1.76"],["46","Pawel Sendyk","","Szczecin, POL","1.76"],["50","Walker Higgins","","Knoxville, TN","1.77"]]
2019-03-24 20:50:51: ["1","Michael Andrew","–","Lawrence, KS","1.00"]
1 Like

@scottfwalter @sylumer I guessed the answer would be something simple like that - THANK YOU.

I have a follow up question. The script successfully writes the 500 multi-field/column records in tblResults to the log. But when I try to write to a CSV file, I get a single very long record containing all data. I’ve tried adding “/n” at the end of each row to no avail. Does FIleManager support appending records to files? From the documentation, it appears only over-writing is available. So my approach was to use toString() and writeString(). (Note: I’ve excluded certain setup code for brevity).

for (var p = 1; p < pageMax; p++) {
let wv = new WebView()
await wv.loadURL(urlBase + urlClass + “/” + urlSex + “/” + urlPageTxt + p.toString())
let tblTemp = await wv.evaluateJavaScript(js)
let tblArray = JSON.parse(tblTemp)
// append new page of table data to prior table data
tblResults = tblArray.reduce( function(coll,item){
coll.push( item );
return coll;
}, tblResults );
}
let FM = FileManager.iCloud() ;
let fileDir = FM.documentsDirectory() ;
// for (var count = 0; count < tblResults.length; count++) {
// log(tblResults[count]) ;
// }
FM.writeString(fileDir+fileName, tblResults.toString()) ;

Wrong direction for the slash? i.e. \n rather than /n as you have above.

let fmLocal = FileManager.local()

const strFilePath = fmLocal.documentsDirectory() + "/multilinefile.txt"
const strContent = "line1\nline2\nline3"

fmLocal.writeString(strFilePath, strContent)
console.log(fmLocal.readString(strFilePath))

That gives me this…

1 Like

How is it one can stare long at a topic on several StackOverflow pages - and then transcribe it incorrectly?
Thank you for your patience and excellent examples.