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

问题描述

背景信息

  • 周一至周五我最多有 15 个小时可以工作。

  • 每天,从周一到周四,我会随机工作 0 - 8 小时。

  • 我可以在周一至周四工作 0 小时。

  • 周五,我会在最多 15 小时的剩余时间里工作 可用小时。

  • 周五我必须至少工作 1 小时。

使用的公式

  • (单元格:C4)周一:RANDBETWEEN(0-8)

  • (单元格:D4)周二:RANDBETWEEN(0-8)

  • (单元格:E4)星期三:RANDBETWEEN(0-8)

  • (单元格:F4)星期四:RANDBETWEEN(0-8)

  • (单元格:G4)周五:15 – SUM(C4:F4)

  • 总小时数:SUM(C4:G4)

问题

  • 星期五单元格有时会收到负数的小时数 工作。

问题输出示例

Output

当前的解决方法

  • 通过按“DEL”更新 RANDBETWEEN 生成的值 空单元格。这会强制更改所有值。

    重复直到单元格中收到星期五的正值

Google Sheet Settings

目标

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

可能的解决方案/想法

有没有办法通过公式强制 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,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)))

然后您可以将其从 D4 复制/粘贴到 E4 和 F4(公式引用有效),并保持 C4 和 G4 不变。这应该可以解决问题!

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

快速解释一下为什么会这样:如果左边的单元格总和为

,

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

代码如下:

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)'];

  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() 行用于调试目的,不是必需的。

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