我正在使用Google为农民建立一个作物规划工具(有点像甘特图)。我需要帮助量化在一个给定的时间框架内,没有作物在床上种植的天数。最后,我希望能够在桌子上按名字引用一张床(例如,第1床或NW4),并知道该床“未种植”的总天数。
电子表格的用户确定..。
我解决问题的尝试遵循了以下步骤,但没有成功:
由于日期/数组有可能重叠,我认为=UNIQUE(FLATTEN(range)
公式将是有用的(总天数-唯一的天数=未种植的天数);然而,第2步被证明是特别困难的。我不知道如何从变量数组中推断出一个组合数组。你在挖?
下面的图像仅仅是示例的直观表示。
例1:单一作物(绿色)种植,总共5天“未种植”(红色)。
例2:种了两种作物,中间和末端留下了空隙。
例3:种植了许多作物,许多作物重叠,在开始和中部留下了缺口。
这是作物规划工具的一个工作模型,但我在上面的问题上没有取得任何有意义的进展:
https://docs.google.com/spreadsheets/d/1oJtPamAb6uZbz42pjUOu6X9QMICalvmJZg7WziPusVk/edit?usp=sharing
奖励:如果有,我会好奇地看到一个使用“移植日期”作为开始日期的版本。
发布于 2021-01-21 00:54:49
你的问题有几个方面。这个答案是为了计算给定床的“未种植天数”。你想按床来分析你的约会,尽管你的样本日期包括一张床。下一步是扩大这一答案,考虑增加床位,每个床位都有各自的作物种植计划。
答案取决于两列;这可能是可以简化的,但现阶段的目的是显示一种计算“未种植”天数的方法。
注意:答案还假定数据是按种子日期排序的。
Latest收获日期
=max($E$2:E2)
:这将显示最新的收获日期。Unplanted日
=if(C3<=F2,0,C3-F2)
:这是比较作物的“种子日期”和“最近的收获日期”在种植之前的作物。如果种子日期大于前一个“最近收获日期”,那么“未播种日”的数量等于“种子日期”和前一个“最近收获日期”之间的差额。增编#1(2021年1月23日)
这是先前解释如何计算未种植天数的答案的延续。
这包括以下方面的细节:
Copying“作物计划”到另一张
一个农民可以选择许多床和许多作物,许多日期。作物计划上的数据输入屏幕可以方便地输入小卷,但不适合输入大量数据或分析数据。
我建议将“作物计划”数据复制/附加到第二张纸上。我将此工作表称为“输出”,但工作表名称是代码中的一个变量,因此您可以将其更改为您想要的任何内容。
将“作物计划”复制到“输出”的脚本是:
function updateCrop2Output() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// define sheeta for Crop Plan and output
var datasheet = "Crop Plan";
var sheet = ss.getSheetByName(datasheet);
//Logger.log("DEBUG: the sheet = "+sheet.getName())
var outputsheet = "Output"
var output = ss.getSheetByName(outputsheet);
// define the data and variables
var headerrow=15; // header row on Crop Plan
var outputarray = []; // array to hold Crop Plan data for update to Output
// find the number of records in the Crop Plan data
// also find the number of beds in the Crop Plan data
var CLR = sheet.getLastRow();
var Crange = sheet.getRange(headerrow+1,3,CLR);
var Cvals = Crange.getValues();
var Clast = Cvals.filter(String).length;
//Logger.log("DEBUG: Number of rows of data = "+Clast);
// get only the actual rows in the Bed Column (Column C) with data
var newCvals = sheet.getRange(headerrow+1,3,Clast).getValues();
//Logger.log("this is newCvals");
//Logger.log(newCvals)
// convert the format of the 2D data to 1D
var Cdata = newCvals.map(function(e){return e[0];});//[[e],[e],[e]]=>[e,e,e]
//Logger.log("DEBUG: this is c data");
//Logger.log(Cdata); // DEBUG;
// get the unique values
Cdata = Array.from(new Set(Cdata));
// Logger.log("DEBUG: this is the unique values in CData");
// Logger.log(Cdata); //DEBUG
// Logger.log("DEBUG: number of unique beds = "+Cdata.length);
for (var cd = 0;cd < Cdata.length;cd++){
// Logger.log("cd="+cd+", cdata = "+Cdata[cd])
}
// get all the CROP data
var plantingrange = sheet.getRange(headerrow+1,3,Clast,8);
// Logger.log("DEBUG: plantingrange = "+plantingrange.getA1Notation());
var plantingdata = plantingrange.getValues();
for (b=0;b
假设标题行已经就位,屏幕将如下所示:
Helper列
答案在工作表"Output“上使用助手列。这些说明说明:
独特的作物床
出现作物床的第一行。
最后一行数据
细胞I2:=unique(INDIRECT("A2:A"&ArrayFormula(max(if(len(A:A),row(A:A),)))))
检测最后一行并相应列出作物的动态公式。
细胞J2:=MATCH(I2,INDIRECT("$A$2:$A$"&$L$2),0)+2
返回每个裁剪床出现的第一行号。
把这个公式复制到独一无二的床上。
细胞L1:=ArrayFormula(max(if(len(A:A),row(A:A),)))
此值用于引用范围结束的公式。
假设标题行已经到位,助手列将如下所示:
Revised公式:“最大收获日期”和“未种植天数”
最初描述的公式假设了一个单一的作物床,但这在大计划中是不现实的。因此,这些公式必须对作物层作出反应。
最大收获日期
细胞F2:=max(INDIRECT("$E$"&vlookup(A2,$I$2:$J$6,2,false)&":E"&row()))
将此公式复制到最后一行数据。
未种植天数
细胞G2:=if(C2<=F1,0,C2-F1)
将此公式复制到最后一行数据。
条件格式
如果需要,您可以突出未种植的日子。选择数据范围,并使用此自定义公式
=and(G2>0,isblank(G2)=FALSE)
输出
最后的输出屏幕可能如下所示:
Addendum#2 (2021年1月23日)
作物床DATA分析
对于给定的“作物床”的结果可以很容易地使用FILTER进行分析。
在本例中,我创建了一个额外的工作表。标题已被长时间复制。
Selecting a“作物床”
参考附带的屏幕截图。
作物床选择器
单元格B1:来自范围=Output!$A$2:$A$1000的数据验证
滤波公式
单元A3:=Filter(Output!A2:G, SEARCH( $B$1, Output!A2:A ) )
Filtered数据
https://webapps.stackexchange.com/questions/150230
复制相似问题