首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在一组组合的变量数组中量化差距?

如何在一组组合的变量数组中量化差距?
EN

Web Applications用户
提问于 2021-01-19 19:53:24
回答 1查看 78关注 0票数 0

我正在使用Google为农民建立一个作物规划工具(有点像甘特图)。我需要帮助量化在一个给定的时间框架内,没有作物在床上种植的天数。最后,我希望能够在桌子上按名字引用一张床(例如,第1床或NW4),并知道该床“未种植”的总天数。

电子表格的用户确定..。

  • 床内庄稼的数量
  • 每种作物(种植)的开始日期
  • 每种作物(收获)的完成日期

我解决问题的尝试遵循了以下步骤,但没有成功:

  1. 通过第一次种植(最低限度)减去最终收获(最大)来计算时间框架。
  2. 按床名过滤(例如NE1)
  3. 使用每个作物的开始日期和结束日期创建一个或多个日期数组。
  4. 组合和扁平阵列
  5. 唯一日期计数数

由于日期/数组有可能重叠,我认为=UNIQUE(FLATTEN(range)公式将是有用的(总天数-唯一的天数=未种植的天数);然而,第2步被证明是特别困难的。我不知道如何从变量数组中推断出一个组合数组。你在挖?

下面的图像仅仅是示例的直观表示。

例1:单一作物(绿色)种植,总共5天“未种植”(红色)。

例2:种了两种作物,中间和末端留下了空隙。

例3:种植了许多作物,许多作物重叠,在开始和中部留下了缺口。

这是作物规划工具的一个工作模型,但我在上面的问题上没有取得任何有意义的进展:

https://docs.google.com/spreadsheets/d/1oJtPamAb6uZbz42pjUOu6X9QMICalvmJZg7WziPusVk/edit?usp=sharing

奖励:如果有,我会好奇地看到一个使用“移植日期”作为开始日期的版本。

EN

回答 1

Web Applications用户

发布于 2021-01-21 00:54:49

你的问题有几个方面。这个答案是为了计算给定床的“未种植天数”。你想按床来分析你的约会,尽管你的样本日期包括一张床。下一步是扩大这一答案,考虑增加床位,每个床位都有各自的作物种植计划。

答案取决于两列;这可能是可以简化的,但现阶段的目的是显示一种计算“未种植”天数的方法。

注意:答案还假定数据是按种子日期排序的。

Latest收获日期

  • 在单元格F2中,插入此公式并按需要复制尽可能多的行
  • =max($E$2:E2):这将显示最新的收获日期。

Unplanted日

  • 在单元格G3中,插入此公式并按需要复制尽可能多的行。
  • =if(C3<=F2,0,C3-F2):这是比较作物的“种子日期”和“最近的收获日期”在种植之前的作物。如果种子日期大于前一个“最近收获日期”,那么“未播种日”的数量等于“种子日期”和前一个“最近收获日期”之间的差额。

增编#1(2021年1月23日)

这是先前解释如何计算未种植天数的答案的延续。

这包括以下方面的细节:

  • 将“作物计划”复制到另一张纸上以便于分析
  • 创建帮助列
  • 更新“最大收获日期”和“未种植日”的公式,以反映包含多个作物床的数据源。
  • 条件格式

Copying“作物计划”到另一张

一个农民可以选择许多床和许多作物,许多日期。作物计划上的数据输入屏幕可以方便地输入小卷,但不适合输入大量数据或分析数据。

我建议将“作物计划”数据复制/附加到第二张纸上。我将此工作表称为“输出”,但工作表名称是代码中的一个变量,因此您可以将其更改为您想要的任何内容。

将“作物计划”复制到“输出”的脚本是:

代码语言:javascript
运行
复制
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数据

票数 0
EN
页面原文内容由Web Applications提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://webapps.stackexchange.com/questions/150230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档