问题描述
背景信息
-
周一至周五我最多有 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,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();
}
}
setSame()
函数设置了一个 onChange
触发器(触发器 > 添加触发器)。 console.log()
行用于调试目的,不是必需的。
我确信使用脚本有更好的方法来解决这个问题,但这是我能想到的解决这个问题的最快方法。