【问题标题】:Adding two time duration values添加两个持续时间值
【发布时间】:2019-12-29 10:57:53
【问题描述】:

我有一个应用脚本代码,它在两列中添加值并在第三列中显示结果。即将 B 列值(持续时间)添加到 D 列(持续时间),结果显示在 E 列中。但是我的代码显示错误怎么办

function adder()
 {
 var sheet = SpreadsheetApp.getActive().getSheetByName('Sheet5');
 var lastRow = sheet.getLastRow(); 
 var cell = sheet.getRange('B1:B'+lastRow).getValues();
 var data = sheet.getRange('D1:D'+lastRow).getValues();
  for (var i = 0; i < lastRow; i++){
     var value1 = cell[i][0];
     var value2 = data[i][0];
     var range = sheet.getRange('E'+(i+1)).setFormula(value1+value2);
     var formattedDate = Utilities.formatDate(new Date(range.getValue()), 'GMT', 'dd/MM/yyyy 
                         HH:mm:ss');
     }
     sheet.getRange('E' + (i+1).toString()).setValue(formattedDate);
   }  

错误截图已上传至

      function dateAdd() 
         {
         var ss = 
          SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet5');
        var range = ss.getRange('E23').setFormula('D23+B23');
        var formattedDate = Utilities.formatDate(range.getValue(), 'GMT', 
                                        'dd/MM/yyyy HH:mm:ss');
         }   

上面的代码适用于单行,我想在循环中设置它。

【问题讨论】:

  • E列的所有值都显示为ERROR only
  • 您添加了 2 个持续时间,然后您想将结果更改为最新吗?我认为您也必须涉及 A 列。
  • 请检查new Date(range.getValue()),范围是duration值
  • @user11982798 实际上结果只是持续时间。我尝试过 new Date(range.getValue) 也仍然出现错误。我想要 hh:mm 中的结果
  • 工作表是私有的

标签: javascript datetime google-apps-script google-sheets


【解决方案1】:

试试这个:

在读取数据之前将持续时间列重新格式化为“#.#########”,然后使用 Range.getDisplayValue()s 然后重新格式化为“[h]:mm:ss”不要遇到字符串与数字的问题。

function runThree() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Sheet5');
  var rgB=sh.getRange(2,2,sh.getLastRow()-1,1);
  var rgD=sh.getRange(2,4,sh.getLastRow()-1,1);
  var rgE=sh.getRange(2,5,sh.getLastRow()-1,1);
  rgE.clearContent();
  rgB.setNumberFormat("#.##########");//increased precision improves round off
  rgD.setNumberFormat("#.##########");
  var vB=rgB.getDisplayValues();
  var vD=rgD.getDisplayValues();
  rgB.setNumberFormat("[h]:mm:ss");
  rgD.setNumberFormat("[h]:mm:ss");
  var vE=[];
  SpreadsheetApp.flush();
  for(var i=0;i<vB.length;i++){
    var sum=vB[i][0]+vD[i][0];
    vE.push([Number(vB[i][0])+Number(vD[i][0])%24]);     
  }
  rgE.setValues(vE);
  rgE.setNumberFormat("[h]:mm:ss")
}  

运行前的第 5 页:

运行后的第 5 页:

我惊讶地发现持续时间将显示高达 1150 小时的小时值。

【讨论】:

  • 我的新列值从第二行开始,而不是从第一个开始,如果我声明 ve =[ ] 它会给出错误,因为数据和范围不匹配
  • 我刚刚做了一个小改动,试一试,看看它是否有效问题。
  • 我测试了我觉得没问题的更改。
  • 你在哪里做的改变,你能说出逻辑
  • var rgB=sh.getRange(2,2,sh.getLastRow()-1,1); var rgD=sh.getRange(2,4,sh.getLastRow()-1,1); var rgE=sh.getRange(2,5,sh.getLastRow()-1,1);
【解决方案2】:

你的失败是value1+value2会变成文字

所以我对您的脚本进行了一些修改(我的脚本是 +0 和 +8,我认为可以更改为您的区域):

function adder()
 {
   var sheet = SpreadsheetApp.getActive().getSheetByName('Log');
   var lastRow = sheet.getLastRow(); 
   var cell = sheet.getRange('C2:C'+lastRow).getValues();
   var data = sheet.getRange('D2:D'+lastRow).getValues();
   for (var i = 0; i < lastRow-1; i++){
       var value1 = cell[i][0];
       var value2 = data[i][0];
       var d = value1;
       d.setHours(value1.getHours()+value2.getHours()+0);
       d.setMinutes(value1.getMinutes()+value2.getMinutes()+8);
       var range = sheet.getRange('E'+(i+2)).setValue(d);
   }
 }  

我的更新:

function adder()
 {
   var sheet = SpreadsheetApp.getActive().getSheetByName('Log');
   var lastRow = sheet.getLastRow(); 
   var cell = sheet.getRange('B1:B'+lastRow).getValues();
   var data = sheet.getRange('D1:D'+lastRow).getValues();
   for (var i = 0; i < lastRow; i++){
     var value1 = cell[i][0];
       var value2 = data[i][0];
       var d = value1;
       d.setHours(value1.getHours()+value2.getHours()+0);
       d.setMinutes(value1.getMinutes()+value2.getMinutes()+8);
       var range = sheet.getRange('E'+(i+1)).setValue(d);
   }
 } 

【讨论】:

  • 在执行时说找不到函数 setHours in object 1
  • 你必须保证脚本随着你的情况而改变,我的C&D,你的B和D,你必须改变它,并且setHours不能被字符串识别,只能是日期和时间。
  • 在我的 A2 样本中,但在你的 A1 样本中,所以你必须修改它
  • 我将样本更改为 B1 和 D1 列,但它仍然这样说。在我的情况下,它在第一行没有受到影响 1:50:00 AM
  • 您的工作表无法访问(私人),所以我无法检查它。 d.setHours(value1.getHours()+value2.getHours()+0); d.setMinutes(value1.getMinutes()+value2.getMinutes()+8); +0 和 +8 你必须检查并更改它。
猜你喜欢
  • 2016-02-23
  • 2021-06-21
  • 2011-01-25
  • 1970-01-01
  • 2015-12-25
  • 2015-08-31
  • 2021-05-28
  • 1970-01-01
相关资源
最近更新 更多