使用自定义应用脚本功能时如何解决过滤器不匹配的问题?

时间:2019-08-02 05:23:47

标签: google-apps-script google-sheets

我是HR,他在IT领域有一点背景,在一家小公司工作。为了使出勤和加班计算自动化,我在App-Script中创建了一个自定义函数,并使用过滤器调用了该函数。它提供了理想的计算方法,但有时会出现“过滤器不匹配”错误,只有在将公式剪切并粘贴到同一位置后才能纠正该错误。

我在App脚本中创建了一个自定义函数,并使用过滤器调用了该函数。

function calculateOT(otAllowedNotSun, otAllowedSun, data, attendance, day) 
{
    var result;
    if(day=="Sun"){
      result = calculateOTSunday(otAllowedSun, attendance, data);
    }
    else {
      result = calculateOTExceptSunday(otAllowedNotSun, attendance, data);
    }
    return result;
}

//这只是一部分功能

我希望自动刷新结果。而是给了我“过滤器不匹配”的结果。

请使用此链接了解更多信息-https://imgur.com/a/M4MnOqf

1 个答案:

答案 0 :(得分:0)

正如用户在评论中所述,显然您的问题是因为该函数要花费30秒钟才能运行,这是自定义函数的限制[1]。您可以通过使用触发器(onEdit,onOpen等)[2]解决此问题,也可以实现一个菜单,您可以在Sheets UI内单击以运行将公式设置为单元格的功能。像这样:

function onOpen() {
  SpreadsheetApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
  .createMenu('test')
  .addItem('Run...', 'calculateOT')
  .addToUi();  
}

function calculateOT(otAllowedNotSun, otAllowedSun, data, attendance, day) {
  var result;
  if(day=="Sun") {
    result = calculateOTSunday(otAllowedSun, attendance, data);
  }
  else {
    result = calculateOTExceptSunday(otAllowedNotSun, attendance, data);
  }

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet Name");
  var formulaCell = sheet.getRange("P5");

  formulaCell.setFormula('=FILTER(' + result + ', $B5:$B8<>"")');
}

我使用了onOpen触发器[3]将菜单插入到Sheets UI中。使用setFormula()函数[4],可以在单元格中设置带有结果变量的公式。

[1] https://developers.google.com/apps-script/guides/services/quotas

[2] https://developers.google.com/apps-script/guides/triggers/

[3] https://developers.google.com/apps-script/guides/menus

[4] https://developers.google.com/apps-script/reference/spreadsheet/range#setformulaformula