javascript - Apps 脚本根据输入源进行不同的绑定(bind)

标签 javascript arrays google-apps-script google-sheets

我有以下代码,它充当 Google 电子表格的自定义函数:

// counts the instances of elem in an array called list
function countInstances(elem, list) {
  var p = 0;

  for (var i = 0; i < list.length; i++) {
    if (list[i] == elem) p++;
  }
  return p
}

function J(E) {
  //var E =   ["a","a","a","a","b","b","b","b","c","c","c","c"];
  var elems = E.getUnique();
  var b;

 return countInstances(elems[0], E);
}

这看起来很简单,但奇怪的事情发生了:

  • 当我在代码中取消注释“var E”时,b 返回我期望的结果:a 为 4,b 为 4,c 为 4,即数组中每个字符的实例数
  • 当我没有将 E 硬编码到代码中,而是使用对电子表格的引用时,b 为我提供 1 表示 a、1 表示 b、1 表示 c。显然,它只识别第一个实例。
  • 当我在 countInstances 中记录 if 条件时,我可以学到两件事:1)只有第一个实例被认为是 TRUE,2)前四次 elem 仍然是“a”,并且 list 也是我所看到的数组它,这意味着比较的评估似乎不对,但我不知道为什么。
  • 当我返回代码并将注释中“here”所在行的“elems[i]”更改为“a”时,例如,再次返回正确的 a 数量。这是我得出的结论,当值被移交给子函数时,发生了一些奇怪的绑定(bind)。

编辑

getUnique 函数

Array.prototype.getUnique = function(){
  var u = {}, a = [];
  for(var i = 0, l = this.length; i < l; ++i){
    if(u.hasOwnProperty(this[i])) {
       continue;
    }
    a.push(this[i]);
    u[this[i]] = 1;
 }
 return a;
}

编辑2:

您可以找到电子表格示例 here .

最佳答案

编辑:如果您想直接在电子表格中将其用作自定义公式 ( example spreadsheet ),则此函数有效:

function J(E) {
  var list = [];
  for (var i = 0; i < E.length; i++) 
  {
    list.push(E[i][0]);    
  }
  var elems = list.getUnique();

  for (var i = 0; i < elems.length; i++) {
    var b = countInstances(elems[i], list); //here
  }   
  return b;
}

关于javascript - Apps 脚本根据输入源进行不同的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36167034/

相关文章:

javascript - 如何区分鼠标选择和日期输入中的键盘事件

java - 使用 mod 的循环队列大小

google-apps-script - 具有大量行的响应时间谷歌电子表格

google-apps-script - 列出 Google 应用程序脚本项目

arrays - 您如何解决 "The parameters (number[]) don' t 与 SpreadsheetApp.Range.setValues 的方法签名匹配”错误

javascript - Javascript - 如何有效地搜索数组中的对象

javascript - 对象没有方法 Javascript

javascript - 在字符串的错误索引中插入的字符

php - 如何使用 PHP 和 MYSQL 在单个单元格数据库中插入/存储多个项目

java - Java 中的作用域和数组是如何工作的?