为什么我的google sheets函数返回typeerror:给定的列表不可编辑?或者:如何将数组输入到GoogleSheets函数中?

2nbm6dog  于 2021-09-13  发布在  Java
关注(0)|答案(3)|浏览(296)

我正在google sheets中创建一个自定义函数,它统计给定单元格范围内给定数组中所有项目的出现次数。
我理解GoogleSheets函数工作的方式是,将您给定的范围转换为单元格中项目的二维数组。因此,范围a4:b5将被传输到函数as

[[the contents of A4, the contents of B4], 
[the contents of A5, the contents of B5]

下一个输入是要在这些单元格中检查的项目列表。从我在网上可以找到的情况来看,数组是在google表单中使用类似于{}的括号给出的。下面给出了我创建的函数。我以前从未使用过javascript,但我知道其他语言,我只是在谷歌上搜索了如何使用for循环和if语句来创建函数,所以我确信错误是由于一些我不知道或错过的简单内容造成的。

function count_if_in_set(range, given_list) {
  let counter = 0;
  for (dim_1 of range) {
    for (dim_2 of dim_1) {
      for (item of given_list) {
        if (item == dim_2) {
          counter += 1
        }
      }
    }
  }
  return counter
}

当我尝试在google sheets中使用此功能时,输入以下内容: =count_if_in_set(Z30:Z33, {1}) ,我收到以下错误: TypeError: given_list is not iterable (line 5). 单元格z30至z33的内容为整数1、2、3、3,应将其作为以下二维数组赋予函数: [[1], [2], [3], [3]] 问题是这个名单 [1] 这是不可容忍的。我有两个假设来解释为什么会这样:
我编码错误,因为我对javascript非常陌生
当GoogleSheets将输入{1}提供给函数时,它不会被传输到列表
为了检查它是否是前者,我检查了我的功能的所有方面。我首先检查了创建函数时是否必须声明变量的类型,但根据我在谷歌上看到的情况,您不需要声明。然后我改变了我所有的想法 for (a of b)for (let a of b) 但那没有任何帮助,从那以后我就被卡住了。
为了解决给代码一个数组的问题,我尝试从 =count_if_in_set(Z30:Z33, {1})=count_if_in_set(Z30:Z33, [1]) ,但这引发了一个公式解析错误,所以我知道不是这样,我尝试将输入更改为 =count_if_in_set(Z30:Z33, (1)) 但这返回了同样的错误。在那之后,我陷入了困境,没有更多的想法。

sbdsn5lh

sbdsn5lh1#

使用普通的电子表格公式可以得到相同的结果,如下所示: =arrayformula( countif(Z30:Z43, { 1, 2, 3 }) ) 要获得总计,请使用以下命令: =arrayformula( sum( countif(Z30:Z43, { 1, 2, 3 }) ) ) 要计算有多少单元格具有包含其中一个搜索键的文本字符串,请使用以下命令: =arrayformula( sum( countif( Z30:Z43, "*" & { "a", "b" } & "*" ) ) ) 如果出于某种原因需要使用自定义函数,请尝试以下方法开始:

function count_if_in_set(values, given_list) {
  let counter = 0;
  values.map(row => row.map(value =>
    counter += (given_list.indexOf(value) !== -1)
  ));
  return counter;
}

这实际上是一种反模式,因为 map 结果不用于任何东西。人们倾向于使用 Array.reduce() ,但 map-map 模式可能更容易遵循,而且它通常用于自定义函数中,通常不聚合结果,但每个参数值只返回一个值。
学习GoogleApps脚本的一些最佳资源包括初学者指南、新的apps脚本编辑器指南、使用GoogleSheets codelab的apps脚本基础知识、扩展GoogleSheets页面、javascript.info、mozilla开发者网络和stack overflow的apps脚本。

voj3qocg

voj3qocg2#

试试这个:
只需查找所选范围内的1、2、3、4、5、6、7、8或9的数字,然后返回项目和计数

function checkforitems(a, b) {
  let obj = {pA:[]};
  Logger.log(a);
  Logger.log(b);
  let arr = b[0];//b enters as a 2d array with a single element
  //collect counts with a pivot table
  a.forEach(r => {
    r.forEach(c => {
      let index = arr.indexOf(c);
      if(~index) {
        if(!obj.hasOwnProperty(arr[index])) {
          obj[arr[index]]=1;
          obj.pA.push(arr[index]);//collect elements as an array
        } else {
          obj[arr[index]]+=1;
        }
      }
    });
  });
  let l = '';
  //obj.pA.sort((x,y) => x - y);//if searching for numbers you can use this to sort them before displaying them 
  obj.pA.forEach(e => {
    l += `${e}-${obj[e]}\n`;
  });
  return l;
}

我的试卷:
COL1COL2COL3COL4COL5COL6COL7COL7COL1011781027419121181371614819151715156731781282179715161911141119015416111111331931543161088217180111761018121611147131018612125311912285481218201818181746148811112115171830615191216151515141811917611111121655612351515151515151514141418151515151515151515151515151515151515151515111111111111111111111111111151515151515151515151515151515151515151515151515151515151515151515151515151
我的公式(l22):
=检查项目(a2:j21,{1,2,3,4,5,6,7,8,9})
返回结果:

1-16
8-14
2-8
7-6
4-11
6-10
3-12
9-8
5-11

试验结果表:

wfveoks0

wfveoks03#

对于任何正在寻找实现该功能的方法的人:
我做了同样的事情,但是稍微改变了一下,所以第二个输入是一个单元格区域,其中包含我想要搜索的区域

相关问题