Google Sheets - 如何在模拟数据时防止出现负值?

Google Sheets - How do I prevent negative values when simulating data?

背景信息

使用的公式

问题

问题输出示例

Output

当前解决方法

Google Sheet Settings

目标

让单元格自动更新自己如果周五单元格中收到负值

可能Solution/Thoughts

有没有办法通过公式强制更新 RANDBETWEEN 数字?

如果是,有没有办法设置一个 WHILE 循环来更新 RANDBETWEEN 值直到星期五的单元格为正数?

有没有办法在特定单元格上使用脚本 运行?目的是模拟工作计划变化的数据。

我确实尝试通过脚本来完成此操作,但无法让单元格正确更新,有时它根本不会更新。

function randomTotal() 
{
  var Monday = SpreadsheetApp.getActiveSheet().getRange('C4');
  var Tuesday = SpreadsheetApp.getActiveSheet().getRange('D4');
  var Wednesday = SpreadsheetApp.getActiveSheet().getRange('E4');
  var Thursday = SpreadsheetApp.getActiveSheet().getRange('F4');
  var Friday = SpreadsheetApp.getActiveSheet().getRange('G4');
  var FridayValue = SpreadsheetApp.getActiveSheet().getRange('G4').getValue();
  
  while(FridayValue < 0)
  {
    newTotal(Monday,Tuesday,Wednesday,Thursday,Friday);
    FridayValue = SpreadsheetApp.getActiveSheet().getRange('G4').getValue();
  }
}
function newTotal(Monday,Tuesday,Wednesday,Thursday,Friday)
{
  Monday.setFormula('=RANDBETWEEN(0,8)');
  Tuesday.setFormula('=RANDBETWEEN(0,8)');
  Wednesday.setFormula('=RANDBETWEEN(0,8)');
  Thursday.setFormula('=RANDBETWEEN(0,8)');
  Friday.setFormula('=15-SUM(C4:F4)');
}

这实际上可以在没有 Google Apps 脚本的情况下完成。我建议单元格 D4

使用以下公式

=RANDBETWEEN(0,IF(SUM($C4:C4)<=6,8,14-SUM($C4:C4)))

然后您可以 copy/paste 从 D4 到 E4 和 F4(公式引用将起作用),并保持 C4 和 G4 不变。这应该可以解决问题![​​=11=]

您绝对可以通过编程方式完成此操作,但一般来说,如果可以不用,那通常是更简单的方法。

快速解释为什么会这样:如果左侧单元格的总和小于等于 6,那么您总可以加起来达到 8 小时,因为它使您的总时间小于等于 14。但是,如果不是这种情况,您想从 14 小时中减去已经拥有的小时数,因为 14 小时是您在周一至周四可以拥有的最大值,并在周五获得至少 1 小时的剩余时间。

虽然鉴于提供的其他答案过于复杂,但我确实为此创建了一个脚本。

代码如下:

function setSame() {
  console.log('Start check');
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetMaster = ss.getSheetByName("Sheet2"); 
  var sortRange = sheetMaster.getRange('B3:E3');
  var forms = ['=RANDBETWEEN(0,8)','=RANDBETWEEN(0,8)','=RANDBETWEEN(0,8)','=RANDBETWEEN(0,8)'];

  sortRange.setValues([forms]);

  var mon = sheetMaster.getRange('B3').getValue();
  sortRange.getCell(1,1).setValue(mon);
  var tues = sheetMaster.getRange('C3').getValue();
  sortRange.getCell(1,2).setValue(tues);
  var wed = sheetMaster.getRange('D3').getValue();
  sortRange.getCell(1,3).setValue(wed);
  var thurs = sheetMaster.getRange('E3').getValue();
  sortRange.getCell(1,4).setValue(thurs);
  var fri = sheetMaster.getRange('F3').getValue();

  console.log('Monday: '+mon);
  console.log('Tuesday: '+tues);
  console.log('Wednesday: '+wed);
  console.log('Thursday: '+thurs);
  console.log('Friday: '+fri);

  if(fri < 1) {
    console.log("less");
    setSame();
  }
}

Sheet

setSame() 函数设置了 onChange 触发器(触发器 > 添加触发器)。 console.log() 行用于调试目的,不是必需的。

我确信有更好的方法可以使用脚本来解决这个问题,但这是我能想到的最快的解决方法。