Google apps script 自定义平均值函数
我在大学里有基本的编码技能,但不熟悉谷歌表单的应用程序脚本,所以我确信我的代码到处都是,也许有一种更简单的方法,但我真的需要一些帮助,然后再拔出我所有的头发 我想做的是: 创建一个函数,从源表上所有应变的平均值列(具有多行相同应变)返回应变的总平均值,并放入应变表上的协调行(每应变1行)。我不明白的是,当有多条相同应变的线时,函数会不断地将平均数相加,以得到总平均数 以下是我的代码:Google apps script 自定义平均值函数,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我在大学里有基本的编码技能,但不熟悉谷歌表单的应用程序脚本,所以我确信我的代码到处都是,也许有一种更简单的方法,但我真的需要一些帮助,然后再拔出我所有的头发 我想做的是: 创建一个函数,从源表上所有应变的平均值列(具有多行相同应变)返回应变的总平均值,并放入应变表上的协调行(每应变1行)。我不明白的是,当有多条相同应变的线时,函数会不断地将平均数相加,以得到总平均数 以下是我的代码: function getAvgYield(x) { //Average Strain Yield funct
function getAvgYield(x) {
//Average Strain Yield function
var strainName1 = x;
//Make Spreadsheets
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName('Strain Yields');
//var strainSheet = ss.getSheetByName('Strains');
//get row number of strainName2 being used
var sourceCell = sourceSheet.getCurrentCell().getRow();
//input necessary data from source sheet
var strainName2 = sourceSheet.getRange(sourceCell, 1).getValue();
var avgPerPlant = sourceSheet.getRange(sourceCell, 5).getValue();
//create & define variables
var avgs = 0;
var avgYield = 0;
var tempYield = 0;
if (strainName1 == strainName2)
{
tempYield += avgPerPlant;
avgs++;
sourceCell++;
strainName2 = sourceSheet.getRange(sourceCell, 1).getValue();
} else
{
avgYield = tempYield / avgs;
avgs = 0;
tempYield = 0;
sourceCell++;
return avgYield;
}
avgYield = tempYield / avgs;
avgs = 0;
tempYield = 0;
return avgYield;
}
编辑:
这是这些表格的截图。“应变率”中的信息来自另一份文件
尝试填充“平均收益率”列
从本表中的平均产量栏中,但将相同的菌株加在一起。
希望这有帮助在“菌株”选项卡上的C2单元中尝试此方法
=AVERAGEIF('Strain Yields'!A:A,A2,'Strain Yields'!E:E)
在“菌株”选项卡上的C2单元格中尝试此操作
=AVERAGEIF('Strain Yields'!A:A,A2,'Strain Yields'!E:E)
您可以制作一个脚本来填补这一空白,但实际上,更灵活的做法是使用一个函数来计算和返回结果,这样就可以在不同的项目中使用:
/**
*计算每组的平均值
*
*@param criteria_range列用于检查组的标准(将根据组进行检查)。
*@param group_range列,其中包含组的名称。
*@param average_range如果标准与组匹配,则要平均的值列。
*@param no_elems消息显示组中是否没有元素。由于错误,它是“无元素”。
*
*@返回每个组的平均值
*/
函数平均值组(标准范围、组范围、平均范围、无元素=“无元素”){
//输入清理
criteria\u range=criteria\u range.map(行=>行[0])
group\u range=group\u range.map(行=>行[0])
average\u range=average\u range.map(行=>行[0])
//计算所有的平均数
常量元素=数学最小值(标准范围长度、平均范围长度)
返回组\u range.map(组=>{
if(!group)return//如果没有组,则提前返回
设总数=0
让计数=0
for(设i=0;i
请注意,此算法仅适用于列。这使得代码更简单,这是您的用例(我认为是最常见的)
要使用它,请在“平均收益率”标题中添加以下内容:
={"Average Yield"; AVERAGEGROUPS('Strain Yields'!A2:A, A2:A, 'Strain Yields'!B2:B)}
算法故障
函数要做的第一件事是从2D值数组(行数组)中提取值。它是通过获取行的第一个元素来实现的,因此它在数组中只有一列值
range.map(row=>row[0])//返回第一列中的值
现在是平均值的时候了<代码>元素只是我们必须检查的元素的长度。它被计算为防止代码超出范围的最小长度。然后我们使用map
()在每组和平均值之间进行1:1的映射。里面是实际的平均计算
这很简单,如果它是组的一部分,我们需要添加元素和计数,并在最后将其除以。我们需要小心没有元素的组。在这种情况下,我们将返回一个字符串,说明(无法返回错误)
工具书类
/**
*计算每组的平均值
*
*@param criteria_range列用于检查组的标准(将根据组进行检查)。
*@param group_range列,其中包含组的名称。
*@param average_range如果标准与组匹配,则要平均的值列。
*@param no_elems消息显示组中是否没有元素。由于错误,它是“无元素”。
*
*@返回每个组的平均值
*/
函数平均值组(标准范围、组范围、平均范围、无元素=“无元素”){
//输入清理
criteria\u range=criteria\u range.map(行=>行[0])
group\u range=group\u range.map(行=>行[0])
average\u range=average\u range.map(行=>行[0])
//计算所有的平均数
常量元素=数学最小值(标准范围长度、平均范围长度)
返回组\u range.map(组=>{
if(!group)return//如果没有组,则提前返回
设总数=0
让计数=0
for(设i=0;i
请注意,此算法仅适用于列。这使得代码更简单,这是您的用例(我认为是最常见的)
要使用它,请在“平均收益率”标题中添加以下内容:
={"Average Yield"; AVERAGEGROUPS('Strain Yields'!A2:A, A2:A, 'Strain Yields'!B2:B)}
算法故障
函数要做的第一件事是从2D值数组(行数组)中提取值。它是通过获取行的第一个元素来实现的,因此它在数组中只有一列值
range.map(row=>row[0])//返回第一列中的值
现在是平均值的时候了<代码>元素只是我们必须检查的元素的长度。它被计算为防止代码超出范围的最小长度。然后我们使用map
()在每组和平均值之间进行1:1的映射。里面是实际的平均计算
这是退出