【问题标题】:Making a list of dates from last month列出上个月的日期
【发布时间】:2021-11-27 16:23:56
【问题描述】:

我想在单元格 A5:A35 中列出上个月的日期。

我目前只使用公式,但它会列出所有天数,而不考虑当月的计数。因此,当我为 11 月制作表格时,列表中将包含 12 月 1 日。我不想那样。

我尝试编写脚本来获取当前月份并搜索该月份的范围,但它不起作用并且看起来很复杂。必须有更清洁的方法。

我只想以编程方式列出上个月的日子。

我有这个

代码功能无法在移动设备上运行

function assignDates() {
const cell = sheet.getRange('A5:A35'); 
cell.setFormula(=EOMONTH(TODAY(),-2)+D5

d5 是一个隐藏列,包含 1、2、3... 等。这是一种非常便宜的方法。

无论月份长短,它都会列出 31 天。

现在为了解决这个问题,我尝试编写一个脚本来获取当前月份,然后删除包含该月份的条目,但它不起作用。

//check to see if dates fall within month
function dateCheck(sheet){
var sheet = SpreadsheetApp.getActive().getSheetByName('test');
//get current month 
var month = Utilities.formatDate(new Date(), "GMT-5", "MMMM")
// Delete days that fall out of range
    var dayRange = sheet.getRange('A5:A36').getDisplayValues();
    dayRange.forEach((date) => { if (date.toString().includes(month)) 
{ sheet.getRangeList(dayRange).clearContent() } })

}

【问题讨论】:

  • 你能展示你目前的方法吗?
  • 我将编辑我的问题以显示
  • 嘿,帕特里克,你已经得到了三个答案。你能提供一些反馈吗?
  • 对不起。这是感恩节,所以我一直在与家人共度时光。我已经用我原来的前提重新编写了我的代码,以拥有另一个删除当前月份的脚本。我将在这里尝试一些解决方案,看看它们是否效果更好。

标签: date google-apps-script google-sheets google-sheets-formula


【解决方案1】:
=SEQUENCE(DAYS(EOMONTH(TODAY(),)+1,EOMONTH(TODAY(),-1)+1),1,EOMONTH(TODAY(),-1)+1)
  • DAYS计算这个月的天数
  • EOMONTH 获取上个月和本月的结束日期
  • SEQUENCE 创建日期序列。

如果您不希望每个月都更改顺序,则需要将TODAY() 更改为静态日期字符串。

【讨论】:

    【解决方案2】:

    在电子表格上获取上个月和本月日历

    代码:

    function getCalendar() {
      const ss = SpreadsheetApp.getActive()
      const sh = ss.getActiveSheet();
      sh.clear();
    
      let oA = [];
      oA.push(monthlyCalendar(new Date().getMonth() - 1, null, true));//helper function
      oA.push(monthlyCalendar(new Date().getMonth(), null, true));//helper function
      //oA.push(monthlyCalendar(new Date().getMonth() + 1, null, true));
      oA.forEach((obj, i) => {
        if (i == 0) {
          sh.getRange(1, 1, 2, obj.cA[0].length).setFontWeight('bold');
          sh.getRange(1, 1, obj.cA.length, obj.cA[0].length).setValues(obj.cA);
        } else {
          let sr = sh.getLastRow() + 2;
          sh.getRange(sr, 1, 2, obj.cA[0].length).setFontWeight('bold');
          sh.getRange(sr, 1, obj.cA.length, obj.cA[0].length).setValues(obj.cA);
          if (obj.roff && obj.coff) {
            sh.getRange(sr, 1).offset(obj.roff, obj.coff).setFontWeight('bold').setFontColor('red');//sets the current date to bold and red
          }
        }
      });
    }
    

    辅助功能:

    function monthlyCalendar(m, wsd, ret) {
      var m = m || new Date().getMonth();
      var wsd = wsd || 1;//defaults to Monday
      var ret = ret || false;
      const td = new Date();
      const [cy,cm,cd] = [td.getFullYear(),td.getMonth(),td.getDate()];
      const dA = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
      const oA = [...Array.from(Array(7).keys(), idx => dA[(idx + wsd) % 7])]
      let dObj = {};
      let midx = {};
      let rObj = {cA:null,roff:null,coff:null};
      oA.forEach(function (e, i) { dObj[e] = i; });
      const mA = [...Array.from(new Array(12).keys(), x => Utilities.formatDate(new Date(2021, x, 15), Session.getScriptTimeZone(), "MMM"))];
      mA.forEach((e, i) => { midx[i] = i; })
      let cA = [];
      let bA = [];
      let wA = [null, null, null, null, null, null, null];
      const ss = SpreadsheetApp.getActive();
      const sh = ss.getActiveSheet();
      sh.clear();
      const year = new Date().getFullYear();
      let i = midx[m % 12];
      let month = new Date(year, i, 1).getMonth();
      let dates = new Date(year, i + 1, 0).getDate();
      cA.push([mA[month], dates, '', '', '', '', '']);
      bA.push(['#ffffff', '#ffffff', '#ffffff', '#ffffff', '#ffffff', '#ffffff', '#ffffff']);
      cA.push(oA)
      //bA.push(['#ffff00', '#ffff00', '#ffff00', '#ffff00', '#ffff00', '#ffff00', '#ffff00']);
      let d = [];
      let ddd = [];
      for (let j = 0; j < dates; j++) {
        let day = new Date(year, i, j + 1).getDay();
        let date = new Date(year, i, j + 1).getDate();
        if (day < wA.length) {
          wA[dObj[dA[day]]] = date;
        }
        if(cy == year && cm == month && cd == date) {
          rObj.roff = cA.length;
          rObj.coff = dObj[dA[day]];
        }
        if (dA[day] == oA[wA.length - 1] || date == dates) {
          cA.push(wA);
          //bA.push(['#ffffff', '#ffffff', '#ffffff', '#ffffff', '#ffffff', '#ffffff', '#ffffff']);
          wA = ['', '', '', '', '', '', ''];
        }
      }
      if (!ret) {
        rObj.cA = cA;
        sh.getRange(1, 1, rObj.cA.length, rObj.cA[0].length).setValues(cA);
        if (rObj.roff && rObj.coff) {
            sh.getRange(1, 1).offset(rObj.roff, rObj.coff).setFontWeight('bold').setFontColor('red');
          }
      } else {
        rObj.cA = cA;
        return rObj;
      }
    }
    

    演示:

    【解决方案3】:

    不错的挑战!

    在A5上输入以下函数:

    =arrayformula(if(eomonth(today(),-2)+row(A5:A35)+1-row()>eomonth(today(),-1),"",eomonth(today(),-2)+row(A5:A35)+1-row()))
    

    它将检索从1号到上个月最后一天的所有日期(与today()相关)。动态截止到 31 日、30 日、28 日或 29 日!

    干杯!

    【讨论】:

      【解决方案4】:

      如果你需要一个脚本,你可以去:

      function myFunction() {
        var today = new Date();
        var year  = today.getFullYear();
        var month = today.getMonth(); // 0 -> January, 1 -> February, etc...
      
        // get the number of days of the previous month
        // 'zero day' of a month is the last day of a previous month
        var len = new Date(year, month, 0).getDate();
      
        // make an array with dates (strings, actually)
        var options = { year: 'numeric', month: 'numeric', day: 'numeric' };
        var dates = new Array(len).fill('').map((_, day) =>
          [new Date(year, month-1, day+1).toLocaleString('en-US', options)])
      
        // put the array on the sheet
        SpreadsheetApp.getActiveSheet().getRange(5,1,len,1).setValues(dates);
      }
      

      约会总是一件棘手的事情。

      【讨论】:

      • 这太接近了。当我运行它时,它使 9/30 到 10/30。我正在寻找 10/01 到 10/31。非常感谢。
      • 我添加了.toLocaleDateString(),看起来它解决了这个问题。
      • 这行得通!谢谢
      • 我怀疑它仍然会在某些时区的月底或月初得到错误的结果(当你所在的地方已经是一月,但它仍然是十二月零子午线等)。日期/时间是一个雷区。尽可能少地使用它们是有意义的。 )
      猜你喜欢
      • 1970-01-01
      • 2012-04-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多