0

TL:DR

According to the google docs, getResponseText() should return a string... but I get a message that claims it is an object when I try to sort it.. huh?

TypeError: Cannot find function sort in object

I was under the impression that a javascript string sort of works like an array, and it seems to behave like one because string[0] returns the first letter of a string..

DETAILS:

here is the sheet I am working

Hello everyone, I have a very unique situation where I need to update dirty strings (courtesy of an undesirable OCR import).

I have created a function that does the job but needs additional functionality.

Currently, the process goes like this:

  1. enter your desired string
  2. each cell (in your selection) is checked for that string
  3. cells are updating with desired string if the match is over 50% alike

the check works like this:

compare the first letter of desired string (txtT[0]) against the first letter of target cell (valT[0])

compare additional letters [x] up to the length of the longest string

for example:

desired string = "testing" target cell = "t3st1ng"

the loop goes like this:

create a point system do to math (total points = length of longest string)

  • compare t and t ... if matching, add one point (+1 in this case because it matches)
  • compare e and 3 ... if matching, add one point (+0 in this case because it does not match)
  • compare s and s ... if matching, add one point (+1 in this case because it matches)
  • compare t and t ... if matching, add one point (+1 in this case because it matches)
  • compare i and 1 ... if matching, add one point (+0 in this case because it does not match)
  • compare n and n ... if matching, add one point (+1 in this case because it matches)
  • compare g and g ... if matching, add one point (+1 in this case because it matches)
  • points earned/total points = % of alike

The problem with this system is that if is based on the position of the letters in each string.

This causes problems when comparing strings like "testing" and "t est ing"

I tried to update it so that the first thing it does is SORT the string alphabetically, ignoring all special characters and non alphabetical characters.

That's when I came across an error:

TypeError: Cannot find function sort in object testing.

This does not make sense because my desired string is a string. See code where it says "this is where i get my error":

According to the google docs, getResponseText() should return a string... but I cannot call the sort method on the string.. which makes no sense!

function sandboxFunction() {
  try {

    var ui = SpreadsheetApp.getUi();

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var as = ss.getActiveSheet();
    var ar = as.getActiveRange();

    var sv = ui.prompt('enter desired string');
    var txt = sv.getResponseText();
    var txtT = txt.trim();
    txtT = txtT.replace(/ /g, ''); //this is the trimmed comparison string
    txtT = txtT.sort(); //***this is where I get my error***
    ui.alert(txtT);

    var vals = ar.getValues();

    for (var r = 0; r < vals.length; r++) {
      var row = vals[r];
      for (var c = 0; c < row.length; c++) {
        var val = row[c];
        var valT = val.trim();
        valT = valT.replace(/ /g, ''); // this is the trimmed comparison cell
        ui.alert(valT);

        //this is where we test the two

        //test length
        var tl = txtT.length;
        var vl = valT.length;
        if (vl < tl) {
          ui.alert("different lengths.. applying fix");
          for (vl; vl < tl; vl++) {
            valT = valT.concat("x");
            ui.alert(valT);
          }
        }
        else if (tl < vl) {
          ui.alert("different lengths.. applying fix");
          for (tl; tl < vl; tl++) {
            txtT = txtT.concat("x");
            ui.alert(txtT);
          }
        }


        if (valT.toUpperCase() == txtT.toUpperCase()) {
          ui.alert("your strings match");
        }
        else {
          var total = txtT.length;
          var pts = 0;
          for (var x = 0; x < total; x++) {
            if (valT[x] == txtT[x]) {
              pts++;
            }
          }
          if (pts / total >= 0.5) {
            ui.alert("at least 50% match, fixing text");
            vals[r][c] = txt;
          }
        }
      }
    }
    ar.setValues(vals);

  }
  catch (err) {
    ui.alert(err);
  }
}
1
  • So why not debug and see what the value that actually returns is? Its probably a response object with the actual string as a field on that object. Most likely that field is called data. Commented Oct 10, 2018 at 16:30

1 Answer 1

1

You can't sort a string in that way, sort is a method of arrays. You can convert your string to an array, later you can sort

var txtT = "This is a string".trim();
txtT = txtT.replace(/ /g, ''); //this is the trimmed comparison string

var txtArray = txtT.split(''); // Convert to array
var txtSorted = txtArray.sort(); // Use sort method
console.log(txtSorted);

See sort() docs

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.