单元格更改时,返回选定范围内的随机日期

时间:2019-02-16 06:57:36

标签: random google-apps-script google-sheets triggers

function genRND(e) { 

  if (e.range.getA1Notation() === 'S1') {

   var AS = SpreadsheetApp.getActiveSpreadsheet();

   var DSTsheet = AS.getActiveSheet();

   var ED = DSTsheet.getRange('T1').getValue();
   var SD = DSTsheet.getRange('T2').getValue();

  for (var NR = 0; NR < 59; NR++){
   if (DSTsheet.getRange('E' & NR).getvalues() != '' && 
    DSTsheet.getRange('T' & NR).getvalues() != 'SOLD'){

     var RNDNUM = Math.floor(Math.random() * (ED-SD)) + SD; 
     var rndDATE = DSTsheet.getRange('A' & RNDNUM);

     DSTsheet.getRange('S' & NR).setValue(rndDATE);
    }     
  }

 }
}

我实际上只需要在单元格S1值更改时每次执行RANDBETWEEN(每次都可以是其他值),而不在任何单元格的每次更改时执行RANDBETWEEN。

因此,触发器设置为S1,它应查找T1和T2以检测范围的开始和结束。 Math.random应该在该范围内运行一些数字。一直到这里都有效!

在循环之后,应检查是否已售出单位或没有状态,跳过这些并使用RNDNUM返回随机日期(日期列表在A列中)。

很快,它不会返回任何结果。

我尝试检查RNDNUM并确实返回了应该返回的值,但是没有返回下一个值-rndDATE(如果应该返回的重要值是日期格式)!

2 个答案:

答案 0 :(得分:0)

您似乎没有获得范围的值,但获得了范围obj:

var RNDNUM = Math.floor(Math.random() * (ED-SD)) + SD; 
var rndDATE = DSTsheet.getRange('A' + RNDNUM).getValue(); //Get value, not Range Obj

DSTsheet.getRange('S' + NR).setValue(rndDATE);

先根据Tanaike的评论进行扩展,然后根据this answer的评论进行扩展:

  

&是按位“与”,期望2个数字并返回一个数字。不鼓励在Javascript中使用它。要将字符串和数字组合在一起,请使用+

答案 1 :(得分:0)

实际上,

var rndDATE = DSTsheet.getRange(RNDNUM, 1).getValue();
DSTsheet.getRange(NR, 21).setValue(rndDATE);

已解决的情况。我不知道为什么('A'和RNDNUM)不是正确的范围格式?