Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 在图纸上单元格的背景中运行公式_Google Apps Script_Google Sheets_Formula_Background Process_Duration - Fatal编程技术网

Google apps script 在图纸上单元格的背景中运行公式

Google apps script 在图纸上单元格的背景中运行公式,google-apps-script,google-sheets,formula,background-process,duration,Google Apps Script,Google Sheets,Formula,Background Process,Duration,我试图制作一张表格,在表格中,我可以在单元格中键入不带冒号或小数的时间(持续时间),它显示在带有冒号和小数的相同的单元格中(例如:输入“10342”,单元格显示为“1:03.42”)。我在另一个单元格中使用的公式是: =ARRAYFORMULA(TEXT(AVERAGE(VALUE(IF(D3<>"", TEXT( IF(IFERROR( LEFT(D3, LEN(D3)-6))="", 0, LEFT(D

我试图制作一张表格,在表格中,我可以在单元格中键入不带冒号或小数的时间(持续时间),它显示在带有冒号和小数的相同的单元格中(例如:输入“10342”,单元格显示为“1:03.42”)。我在另一个单元格中使用的公式是:

=ARRAYFORMULA(TEXT(AVERAGE(VALUE(IF(D3<>"", TEXT(
 IF(IFERROR(      LEFT(D3, LEN(D3)-6))="",      0,         LEFT(D3, LEN(D3)-6))&":"&
 IF(IFERROR(RIGHT(LEFT(D3, LEN(D3)-4), 2))="", "00", RIGHT(LEFT(D3, LEN(D3)-4), 2))&":"& 
 IF(IFERROR(RIGHT(LEFT(D3, LEN(D3)-2), 2))="", "00", RIGHT(LEFT(D3, LEN(D3)-2), 2))&"."& 
 IF(LEN(D3)>1, RIGHT(D3, 2), "0"&D3), "[h]:mm:ss.00"), ))), "[h]:mm:ss.00"))
=ARRAYFORMULA(文本)(平均值)(如果为D3“”,则为文本(
如果(IFERROR(LEFT(D3,LEN(D3)-6))=“0,LEFT(D3,LEN(D3)-6))&”:&
如果(IFERROR(RIGHT(LEFT(D3,LEN(D3)-4),2))='',“00”,右(LEFT(D3,LEN(D3)-4),2))&:“&”
如果(IFERROR(RIGHT(LEFT(D3,LEN(D3)-2),2))='',“00”,右(LEFT(D3,LEN(D3)-2),2))&“
如果(LEN(D3)>1,右(D3,2),“0”和“D3”,“[h]:mm:ss.00”),”[h]:mm:ss.00”),“)

我尝试过条件格式,但我不是最擅长使用宏的。无论如何,这是可能的吗?

您显然需要一个onEdit函数。您必须在电子表格文件中打开脚本编辑器并复制粘贴我在此处提供的代码段。使用以下代码,每次编辑“Sheet1”的列a中的单元格时,都会将所需的输入格式返回到完全相同的单元格中。如果输入的值为:10342,则将变为:1:03.42。如果输入的值为130342,则返回13:03.42。如果只想编辑第1行之后的单元格(如果有标题),可以在If条件语句中添加条件:row>1

  function onEdit(e) {
  
  var row = e.range.getRow();
  var col = e.range.getColumn();
  
  if (col === 1 && e.source.getActiveSheet().getName() === "Sheet1"){
   
   var valu = e.source.getActiveSheet().getRange(row,1).getValue().toString()
   
   if (valu.length == 5){
    var result =  valu.slice(0,1)+":"+valu.slice(1,3)+"."+valu.slice(-2);
  } 
  else if ( valu.length==6) {
  var result = valu.slice(0,2)+":"+valu.slice(2,4)+"."+valu.slice(-2);
  }
   e.source.getActiveSheet().getRange(row,1).setValue(result); 
  }
  
}

不要忘记修改工作表的名称(在我的例子中是“Sheet1”)以及要使用的列。如您所见,我的解决方案使用
col==1
e.source.getActiveSheet().getRange(第1行).setValue(结果)
var valu=e.source.getActiveSheet().getRange(第1行).getValue().toString()
。数字1对应于A列。例如,如果要使用D列,则需要将所有这些公式的1替换为4。如果您有任何问题,请在评论中告诉我。

这是否回答了您的问题?成功了。现在我很好奇如何让它在不止一个专栏上工作。我尝试将“col==1”更改为“>0”,但随后它停止工作。我也希望得到这些时间的平均值。根据上面列出的公式,我得到了一个值,即持续时间,所以当我将它乘以86400时,它将给出相同的时间,但以秒为单位,让工作表计算出平均值。我已尝试在中添加该公式,但它不能作为脚本使用。为了对不同的列应用相同的逻辑,您可以编辑我提供的代码,或者复制OneEdit函数并更改列号。请接受我的回答,如果它回答了你最初的问题。我将能够在另一个帖子中回答您的其他问题。我认为您的其他问题与电子表格文件的格式有关。如果你认为我的回答有用的话,请接受我的回答。好吧,我把这些都做好了。我让它从某一行开始,有没有办法让它在某一行停止这样做,比如从第4行开始,到第9行结束?用这个替换第一个if语句(col==1&&e.source.getActiveSheet().getName()==“Sheet1”&&row>3&&row