-自定义函数return不更新
-Custom function return does not update
我一直在制作一个脚本来查找与昵称相关联的数字(等级)。我为此创建了一个自定义函数。基本上,公式输入在昵称数组中找到输入(昵称),它通过添加 2(+1 因为数组从 0 开始,+1 因为我的列的索引)将数组顺序转换为行号。这样做之后,它会转到排名编号所在的列,这就是它 returns.
脚本运行良好,但是当我更新排名时,公式并不总是 return 新值(但如果我再次 运行 公式,它就会出现)所以我想问题是执行它的时间太长,或者我的电子表格并没有像我设置的那样每分钟都重新计算。
这是什么问题,我该如何解决?谢谢!
这是自定义函数的代码:
/**
* 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;
}
更新:
第一列是一个名字列表,上面有一个数字(排名)。第 5 列有 recruit_name。该函数所做的是在第一列中查找 recruit_name,在本例中它位于 (2,1) 上,然后复制分配给它的数字(等级,在本例中为单元格 (2, 2)).这就是函数 return->2 的内容。
当我将 2 更改为 3(或任何其他数字!=2)时,问题就来了,现在单元格 (2,2) 将有一个 3 但单元格 (1,5) 的函数输入没有改变,这就是为什么return 没有更新。
公式的return没有在图中,但是可以在例如(1,6)中。
仅当打开电子表格并且其中一个参数值发生更改时,才会重新计算自定义函数。
相关
解决方案
如果你想要一个函数,每次 sheet 发生变化时都会立即更新,你应该寻找的是 onEdit() simple trigger.
在下面的实现中,我在为此目的分配的单元格中设置 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);
}
希望对您有所帮助。让我知道您是否需要其他任何东西或者您不明白什么。 :)
我一直在制作一个脚本来查找与昵称相关联的数字(等级)。我为此创建了一个自定义函数。基本上,公式输入在昵称数组中找到输入(昵称),它通过添加 2(+1 因为数组从 0 开始,+1 因为我的列的索引)将数组顺序转换为行号。这样做之后,它会转到排名编号所在的列,这就是它 returns.
脚本运行良好,但是当我更新排名时,公式并不总是 return 新值(但如果我再次 运行 公式,它就会出现)所以我想问题是执行它的时间太长,或者我的电子表格并没有像我设置的那样每分钟都重新计算。
这是什么问题,我该如何解决?谢谢!
这是自定义函数的代码:
/**
* 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;
}
更新:
第一列是一个名字列表,上面有一个数字(排名)。第 5 列有 recruit_name。该函数所做的是在第一列中查找 recruit_name,在本例中它位于 (2,1) 上,然后复制分配给它的数字(等级,在本例中为单元格 (2, 2)).这就是函数 return->2 的内容。 当我将 2 更改为 3(或任何其他数字!=2)时,问题就来了,现在单元格 (2,2) 将有一个 3 但单元格 (1,5) 的函数输入没有改变,这就是为什么return 没有更新。
公式的return没有在图中,但是可以在例如(1,6)中。
仅当打开电子表格并且其中一个参数值发生更改时,才会重新计算自定义函数。
相关
解决方案
如果你想要一个函数,每次 sheet 发生变化时都会立即更新,你应该寻找的是 onEdit() simple trigger.
在下面的实现中,我在为此目的分配的单元格中设置 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);
}
希望对您有所帮助。让我知道您是否需要其他任何东西或者您不明白什么。 :)