Google Sheets - 如何在模拟数据时防止出现负值?
Google Sheets - How do I prevent negative values when simulating data?
背景信息
周一至周五我最多有 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
目标
让单元格自动更新自己如果周五单元格中收到负值
可能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();
}
}
setSame()
函数设置了 onChange
触发器(触发器 > 添加触发器)。 console.log()
行用于调试目的,不是必需的。
我确信有更好的方法可以使用脚本来解决这个问题,但这是我能想到的最快的解决方法。
背景信息
周一至周五我最多有 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
目标
让单元格自动更新自己如果周五单元格中收到负值
可能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();
}
}
setSame()
函数设置了 onChange
触发器(触发器 > 添加触发器)。 console.log()
行用于调试目的,不是必需的。
我确信有更好的方法可以使用脚本来解决这个问题,但这是我能想到的最快的解决方法。