【问题标题】:How to increase a date in Google Sheets script?如何在 Google 表格脚本中增加日期?
【发布时间】:2019-12-11 15:58:40
【问题描述】:

我是 gsheets 脚本的新手。我正在尝试这样做:在一个单元格中获取一个日期,然后将其更改为后一天,然后将其返回到另一个单元格。

  var range = sheet.getRange('I1'); 
  var date = range.getValues();
  var datetmp = new Date(date);
  datetmp = datetmp + 1;
  newcell.setValue(datetmp).setHorizontalAlignment("center");

I1 单元格的日期是 27/12/2019。 我得到的结果是“Fri Dec 27 2019 00:00:00 GMT+0700 (ICT)1”。我在互联网上搜索了像 js 这样的脚本代码。所以我这样做datetmp = datetmp + 1; 但似乎它不起作用。有没有办法在 GoogleSheets 中做到这一点。谢谢。

【问题讨论】:

  • 请看一下这个stackoverflow.com/questions/40893620/…希望对您有帮助!
  • 这能回答你的问题吗? Google App Script Adding one Day to a date
  • 感谢您的帮助。但我的问题是我得到的结果是一个字符串。我以为第二天会有一个日期+1。但似乎 gsheets 加上带有字符串“1”的日期并返回我的结果。我不知道为什么:(
  • datetmp 是日期对象而不是数字(虽然存储为数字)javascripture.com/Date
  • 是的,我认为一个日期 obj +1 会得到下一个日期(在互联网上搜索)。我错了吗……

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


【解决方案1】:

不要只添加 1,而是尝试像这样添加另一天:

var date = new Date();
date.setDate(date.getDate()+1);

【讨论】:

    【解决方案2】:

    这实际上是我过去遇到很多麻烦的事情,所以我玩了一下。

    代码如下:

    function onOpen() {
      SpreadsheetApp.getUi().createMenu("Date Tools")
      .addItem('Generate Spreadsheet', 'generateTheSpreadsheet')
      .addItem('Display Format of Active Range', 'displayFormatOfActiveRange')
      .addItem('Clear Format of Active Range', 'clearFormatOfActiveRange')
      .addItem('Set Format of Active Range', 'setFormatOfActiveRange')
      .addItem('Select Column Skip Header', 'jjeSUS1.selectColumnsSkipHeader')
      .addToUi();
    }
    
    function generateTheSpreadsheet() {
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getActiveSheet();
      var fA=[['','','','','']];
      var oA=[['Description','Code','Result as Number','Result as Date','Date().valueOf()']];
      oA.push(['','','#0.##########','M/d/yyyy','#']);
      fA.push(['','','','','']);
      if(sh.getLastRow()>1) {
        sh.getRange(1,1,sh.getLastRow(),fA[0].length).clearContent();
      }
      oA.push(['Today','new Date()',new Date(),new Date(),Number(new Date().valueOf()).toFixed(0)]);
      fA.push(['','','#0.##########','M/d/yyyy','#']);
      oA.push(['Tomorrow at Midnight','new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()+1)',new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()+1),new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()+1),Number(new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()+1)).toFixed(0)]);
      fA.push(['','','#0.##########','M/d/yyyy','#']);
      oA.push(['Yesterday at Midnight','new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()-1)',new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()-1),new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()-1),Number(new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()-1)).toFixed(0)]);
      fA.push(['','','#0.##########','M/d/yyyy','#']);
      oA.push(['Tomorrow same time setDate()','new Date().setDate(new Date().getDate()+1)',new Date().setDate(new Date().getDate()+1),new Date().setDate(new Date().getDate()+1),Number(new Date().setDate(new Date().getDate()+1).valueOf()).toFixed(0)]);
      fA.push(['','','#0.##########','M/d/yyyy','#']);
      oA.push(['Tomorrow same time','new Date(new Date().setDate(new Date().getDate()+1))',new Date(new Date().setDate(new Date().getDate()+1)),new Date(new Date().setDate(new Date().getDate()+1)),Number(new Date().setDate(new Date().getDate()+1).valueOf()).toFixed(0)]);
      fA.push(['','','#0.##########','M/d/yyyy','#']);
      sh.getRange(1,1,oA.length,oA[0].length).setValues(oA);
      sh.getRange(1,1,fA.length,fA[0].length).setNumberFormats(fA);
      
    }
    
    function displayFormatOfActiveRange() {
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getActiveSheet();
      var rg=sh.getActiveRange();
      var row=rg.getRow();
      var col=rg.getColumn();
      var fA=rg.getNumberFormats();
      var vA=rg.getValues();
      var html='<style>th,td{border:1px solid black;padding:2px 4px;}</style><table><tr><th>Row</th><th>Column</th><th>Value</th><th>Format</th></tr>';
      for(var i=0;i<vA.length;i++) {
        for(var j=0;j<vA[i].length;j++) {
          html+=Utilities.formatString('<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>',row+i,col+j,vA[i][j],fA[i][j]);
        }
      }
      html+='</table>';
      var userInterface=HtmlService.createHtmlOutput(html).setWidth(600);
      SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Values & Formats');
    }
    
    function clearFormatOfActiveRange() {
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getActiveSheet();
      var rg=sh.getActiveRange();
      rg.setNumberFormat('');
    }
    
    function setFormatOfActiveRange() {
      var ss=SpreadsheetApp.getActive();
      var sh=ss.getActiveSheet();
      var rg=sh.getActiveRange();
      var fA=rg.getNumberFormats();
      var resp=SpreadsheetApp.getUi().prompt("Formats", fA[0][0], SpreadsheetApp.getUi().ButtonSet.OK_CANCEL);
      if(resp.getSelectedButton()==SpreadsheetApp.getUi().Button.OK) {
        rg.setNumberFormat(resp.getResponseText());
      }
    }
    

    这是我的电子表格的样子:

    Spreadsheet Link

    A 列是对每一行的简单描述。

    B 列是 C 列和 D 列中的实际代码

    C列的数字格式为#0.##########

    D列的数字格式为M/d/yyyy

    否则C列和D列相同。

    列 E Javascript Date().valueOf() 方法结果

    F 列是一个简单的单元格函数,它将每行 D 列中的值加 1

    G 列和 H 列是 C 列和 D 列上的 isDate() 函数。有趣的是,C 列和 D 列之间的唯一区别是格式,所以我猜 ISDATE() 会告诉你更多关于格式的信息单元格而不是单元格内部的对象类型。

    第 4 行曾经是其他答案之一,您可以看到它返回毫秒数,因此电子表格似乎并不真正知道如何处理它。当它像在 F 列中那样添加一个时,它只会将毫秒数增加一。

    第 5 行使用与第 4 行相同的方法,但我再次将它传递给 Date() 构造函数,它返回一个不错的日期对象,电子表格很高兴将其变成它的 Date 对象之一,并在列 C 和 D它继续将值正确显示为一种情况下的数字和另一种情况下的日期。此外,它似乎可以很好地与其他电子表格函数一起使用,就像它在 F 列中通过生成第二天日期一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多