google-apps-script - 谷歌表格 - 模拟数据时如何防止负值?
问题描述
背景信息
周一至周五,我最多有 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)
问题
- 星期五单元格偶尔会收到负数的工作小时数。
问题的示例输出
当前的解决方法
通过在空单元格上按“DEL”来更新 RANDBETWEEN 生成的值。这会强制所有值发生变化。
重复直到周五的单元格中收到正值
目标
如果星期五在单元格中收到负值,则让单元格自动更新
可能的解决方案/想法
有没有办法通过公式强制 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)))
然后,您可以将其从 D4 复制/粘贴到 E4 和 F4(公式引用将起作用),并保持 C4 和 G4 不变。这应该够了吧!
您绝对可以通过编程方式完成此操作,但总的来说,如果可以不这样做,那通常是更简单的方法。
快速解释一下为什么会这样:如果左边的单元格总和 <=6,那么你总是可以加起来 8 小时,因为它使你的总和在 <= 14 的范围内。但是,如果不是这种情况,您想从 14 中减去您已经拥有的小时数,因为 14 是您在周一至周四可以拥有的最大值,并在周五获得至少 1 的剩余时间。
推荐阅读
- javascript - $(...).sparkline 不是函数(jQuery Sparklines)
- perforce - 为什么 Perforce 填充命令很慢?
- azure-service-fabric - ImageStoreService IdleSecondary 副本
- node.js - nodejs Express 正则表达式路径:在测试中工作,而不是在代码中工作。我做错了什么?
- algorithm - 检测我的数字异常增长/下降的算法
- sql-server - 在第一个 SELECT 中分配的变量不会在第二个 SELECT 中检索
- android - 工具栏后退/主页按钮的 Xamarin 资源 ID 与 Resource.Id.home 不匹配
- javascript - Ember 项目中类的常规目录是什么?
- laravel - 获取数据集合 Laravel Eloquent 疑惑
- vue.js - 使用 Nightwatch 选择 Vue 组件?