1

我一直在制作一个脚本来查找与昵称相关的数字(等级)。我为此创建了一个自定义函数。基本上,公式输入在昵称数组中找到该输入(昵称),它通过添加 2 将数组顺序转换为行号(+1,因为数组从 0 开始,并且由于我的列的索引而 +1)。之后,它会转到排名号所在的列,这就是它返回的内容。

该脚本运行良好,但是当我更新排名数字时,公式并不总是返回新值(但如果我再次运行公式,它会返回)所以我认为问题是执行它或者我的因为我已经设置了设置,电子表格并没有真正每分钟重新计算一次。

有什么问题,我该如何解决?谢谢!

这是自定义函数的代码:

/**
* Finds the rank of the inputed user
*
* @customfunction
*/
function FINDRECRUITRANK(Recruit_Name) {
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var display = ss.getSheetByName("DisplaySheet");
  var lastRow = display.getRange("B133").getValue(); //B133 has a counter of total rows used
  var allnicknamesbeta = display.getRange(2, 3, lastRow-1).getValues();
  var allnicknames = allnicknamesbeta.map(function(r){ return r[0]; });
  
  
  var index =  allnicknames.indexOf(Recruit_Name) + 2; // +1 because array starts from 0 and +1 because of the first row index
  
 
  var recruitRank = display.getRange(index, 4).getValue();
  
  return recruitRank;
}

更新: 示例图片

第一列是分配有数字的名称列表(排名)。5th clumn 有recruit_name。该函数的作用是在第一列中查找招聘名称,在这种情况下它将位于 (2,1) 上,然后复制分配给它的数字(排名,在这种情况下位于单元格 (2,2) 上)。这就是函数将返回的内容-> 2。当我将 2 更改为 3(或任何其他数字!=2)时,问题就出现了,现在单元格(2,2)将有一个 3,但作为单元格(1,5)的函数输入没有改变,这就是为什么return 没有得到更新。

公式的返回不在图片中,但它可能在例如 (1,6) 中。

4

2 回答 2

2

仅当打开电子表格并更改参数值之一时,才会重新计算自定义函数。

有关的

于 2020-07-21T02:52:00.980 回答
0

解决方案

如果您想拥有一个在每次工作表发生更改时立即更新的功能,您应该寻找一个onEdit() 简单触发器

在下面的实现中,我在分配的单元格中为此设置了值,Recruit_Name并在也为此目的分配的不同单元格中返回 Apps 脚本函数的值。这样,所有的值都会自动更新。

/**
* Finds the rank of the inputed user
*
* @customfunction
*/

function onEdit() {
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var display = ss.getSheetByName("DisplaySheet");
  
  // Get your parameter you were getting before in the sheet in a specific cell of it
  var Recruit_Name = display.getRange("F1").getValue();
  var lastRow = display.getRange("B133").getValue(); //B133 has a counter of total rows used
  var allnicknamesbeta = display.getRange(2, 3, lastRow-1,1).getValues();
  var allnicknames = allnicknamesbeta.map(function(r){ return r[0]; });
  
  
  var index =  allnicknames.indexOf(Recruit_Name) + 2; // +1 because array starts from 0 and +1 because of the first row index
  
 
  var recruitRank = display.getRange(index, 4).getValue();
  
  // Show the result of all the operations in a specific cell allocated for this function
  display.getRange('F2').setValue(recruitRank);
}

我希望这对你有所帮助。让我知道您是否需要其他任何内容,或者您​​是否不理解某些内容。:)

于 2020-07-23T08:57:32.337 回答