【问题标题】:-Custom function return does not update-自定义函数返回不更新
【发布时间】:2020-07-21 00:31:26
【问题描述】:

我一直在编写一个脚本来查找与昵称相关的数字(等级)。我为此创建了一个自定义函数。基本上,公式输入在昵称数组中找到该输入(昵称),它通过添加 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。该函数的作用是在第一列中查找recruit_name,在这种情况下它将位于(2,1)上,然后复制分配给它的数字(排名,在这种情况下位于单元格(2,2)上)。这就是函数将返回的内容-> 2。 当我将 2 更改为 3(或任何其他数字!=2)时,问题就出现了,现在单元格(2,2)将有一个 3,但作为单元格(1,5)的函数输入没有改变,这就是为什么return 没有得到更新。

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

【问题讨论】:

  • 为了正确理解您的问题,您能否向我们展示用于复制您的问题的示例值?
  • @Tanaike 如果我们能够再添加一个标签 --> google-sheets-custom-function
  • @Rubén 感谢您提供的信息。那是新标签!我可以从你的评论中知道。谢谢。
  • @Tanaike 是的,这是一个新标签。
  • 嗨!您是否考虑过使用onEdit 以便能够在电子表格中的某些内容发生更改时更新单元格?这将不允许您使用自定义功能,但可以让您更新单元格。但是,我们仍然可以将参数作为来自另一个单元格的值传递。你会对这样的答案感兴趣吗?

标签: google-apps-script google-sheets google-sheets-formula google-sheets-custom-function


【解决方案1】:

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

相关

【讨论】:

    【解决方案2】:

    解决方案

    如果您希望有一个功能在每次工作表发生更改时立即更新,您应该寻找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);
    }

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

    【讨论】:

    • 感谢您并为(非常)迟到的回复感到抱歉。我最终做的是一个类似的解决方案,我将这些单元格剪切到另一个范围并将它们粘贴回来,以便单元格内容得到更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 2015-06-09
    • 2016-04-15
    • 1970-01-01
    • 2013-01-22
    相关资源
    最近更新 更多