goO脚本中的indexOf

时间:2017-12-01 03:13:34

标签: javascript google-apps-script indexof

我正在尝试在google脚本中的对象上使用findIndex()但它不起作用。这是一个例子:

function myFunction() {
var searchingJohn = "John"; 
var DATA = {namesList: []};  
 DATA.namesList.push({name: "John", otherDataForThisName: []});
 var result = DATA.namesList.findIndex(function (element)
       {return element.name == this;}, searchingJohn);
 return result;
}

这个工作在javascript consol中很好但是google脚本返回给我一个“TypeError:在对象中找不到Fonction findIndex .....”

4 个答案:

答案 0 :(得分:1)

你不能。

您正尝试在对象上使用findIndex(),但findIndex()用于数组。

来自findIndex()上的MDN文档:

  

findIndex()方法返回数组中第一个满足所提供测试函数的元素的索引。否则返回-1。

原因是对象不以任何特定顺序持有键值对。例如,

{key1:value1, key2:value2}

{key2:value2, key1:value1}

是完全相同的对象。所以没有索引可以找到。

答案 1 :(得分:1)

这是使用findIndex()函数在Google脚本中的对象中搜索字符串的示例。示例:

function myFunction() { 
  var DATA = {namesList: []}; 
  DATA.namesList.push({name: "John", otherDataForThisName: []});
  DATA.namesList.push({name: "Mark", otherDataForThisName: []});
  DATA.namesList.push({name: "Twin", otherDataForThisName: []});
  const searching = "Mark";

  var result = DATA.namesList.findIndex(function (element){
     return element.name.toLowerCase() == searching.toLowerCase();
  });
  return result;
}

findIndex()函数也可用于二维数组。

我从以下链接获得了解决方案:http://one7techlab.com/post/findindex-function-in-google-script-4

答案 2 :(得分:0)

var ss = SpreadsheetApp.getActiveSpreadsheet();
var cellRange = ss.getRange("B5:Q10").getValues();
var someString = "John";

if (cellRange == "John")
{
    //Do this code.
}

这是我可以想到的唯一获取您想要的信息的方法。指数();如果“ John”在数组中,则从索引遍历中拉出,看起来像这样[[J],“ o”,“ h”,“ n”],这就是为什么不能以这种方式找到它的原因。

上面的代码将在一系列单元格中找到它,您可以完成整个工作表,但添加的“空”越多,它的运行速度就越慢。如果需要检查大量工作表,则另一个嵌套的if循环可以为您清理该循环。

答案 3 :(得分:0)

在使用gscript的许多基本javascript功能方面,我也遇到了同样的问题,我在脚本的顶部添加了polyfill,并且它在许多功能上均有效。

将此代码粘贴到脚本顶部,它将支持indexOf。

// This version tries to optimize by only checking for "in" when looking for undefined and
// skipping the definitely fruitless NaN search. Other parts are merely cosmetic conciseness.
// Whether it is actually faster remains to be seen.
if (!Array.prototype.indexOf)
  Array.prototype.indexOf = (function(Object, max, min) {
    "use strict"
    return function indexOf(member, fromIndex) {
      if (this === null || this === undefined)
        throw TypeError("Array.prototype.indexOf called on null or undefined")

      var that = Object(this), Len = that.length >>> 0, i = min(fromIndex | 0, Len)
      if (i < 0) i = max(0, Len + i)
      else if (i >= Len) return -1

      if (member === void 0) {        // undefined
        for (; i !== Len; ++i) if (that[i] === void 0 && i in that) return i
      } else if (member !== member) { // NaN
        return -1 // Since NaN !== NaN, it will never be found. Fast-path it.
      } else                          // all else
        for (; i !== Len; ++i) if (that[i] === member) return i 

      return -1 // if the value was not found, then return -1
    }
  })(Object, Math.max, Math.min)

参考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Polyfill