Google Apps脚本“无所事事”#34;如果Google表格中未满足条件,则在自定义函数中

时间:2018-01-21 02:51:26

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

我正在尝试使用Google Apps脚本在Google表格中创建自定义功能,但是当条件为假时,它不会单独留下单元格,而是删除那里的内容并将其留空,当我需要它时只需& #34;什么都不做" (留下最后一个值)。我的脚本是:

function score(a,b) {
 var today = new Date();
 var deadline = new Date(a);
 if (today <= deadline && b != 0){
     return b;
  }
}

这里的想法是,每天函数都会显示一个单元格值(&#34; b&#34;),它每天也会更改其内容,直到在另一个单元格中设置的某一天(&#34; a&#34;),然后留下放在那里的最后一个值。这里的问题是,在第二天,它不是留下最后一个值,而是将单元格留空。

自定义函数最终为=SCORE(F10,B10)(F10是截止日期,B10的值每天都在变化。自定义函数在H1中。)

我试过把&#34;其他&#34;条件,但也没有工作(像else {return;}或者其他{return false;}),但没有任何效果。我该怎么做才能把最后一个值放在那里。有没有办法在某个地方保存最后一个值然后把它放在那里如果没有办法放一个if ... else&#34;什么都不做&#34;?

2 个答案:

答案 0 :(得分:0)

我建议再次查看你的整个逻辑。我只会给你写一个示例脚本:

function mainFunction(){
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sheet = ss.getActiveSheet();
   var myRange = sheet.getRange(1, 1);
   doNothing(myRange.getValue());
}

function doNothing(a){

  if(a <= 100){
    Logger.log("less than or equal to 100");
  }else{

  }
}

当值为100时,它满足条件:

[18-01-21 ] less than or equal to 100

当值大于100时,它什么都不做,日志上没有打印任何内容。

答案 1 :(得分:0)

与onEdit触发器相反,自定义函数在开始重新计算之前无法获取值。

为了验证这一点,我做了以下自定义功能

/**
 *
 * @param {number} newValue
 * @customfunction
 */
function test(newValue) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var cell = ss.getActiveCell();
  var oldValue = cell.getValue();
  return [[newValue,oldValue]];
}

值和公式

  |    A    |      B        |      C      |
--+---------|---------------|-------------|
 1|        1|=test(A1)      |             |

结果

  |    A    |      B        |      C      |
--+---------|---------------|-------------|
 1|        1|              1|#ERROR!      |

另一种方法是使用“属性服务”来存储旧值

实施例

以下功能是对上述示例的改进,仅用于显示属性服务的使用。

/**
 *
 * @param {number} newValue
 * @customfunction
 */
function test2(newValue) {
  var DocumentProperties = PropertiesService.getDocumentProperties();
  var key = 'test2:' + 
     SpreadsheetApp
       .getActiveSpreadsheet()
       .getActiveCell()
       .getA1Notation();
  var oldValue = DocumentProperties.getProperty(key);
  DocumentProperties.setProperty(key, newValue);
  return [[newValue, parseInt(oldValue,10)]];
}

注意:

  • 如果参数值是对空白单元格或字符串的引用,则第二个值将为#NUM!
  • 假设该功能将通过电子表格在单张纸上使用。如果您打算在多张纸上使用您的功能,请将纸张名称添加到该键或其他方式,以防止从不同的纸张覆盖相同的密钥。
  • 使用了&#39; test2:&#39;作为关键前缀。您可以使用更适合脚本的方法。
  • 对属性服务的调用很慢,因此它可能不适用于将自定义函数应用于数十或数百个单元格的用例,因为自定义函数的执行时间限制为30秒。

将上述内容应用于问题函数的一种方法如下:

function score(a,b) {
  var DocumentProperties = PropertiesService.getDocumentProperties();
  var key = 'score:' + SpreadsheetApp
    .getActiveSpreadsheet()
    .getActiveCell()
    .getA1Notation();
  var oldValueString = DocumentProperties.getProperty(key);
  var today = new Date();
  var deadline = new Date(a);
  if (today <= deadline && b != 0){
    DocumentProperties.setProperty(key, b);
    return b;
  } else {
    return parseInt(oldValueString,10);
  }
}

相关