用于按日期粘贴粘贴到位置变量的值的脚本

时间:2019-07-15 19:12:02

标签: google-apps-script google-sheets

我有一张工作表,用于追踪人工成本,每小时有人输入每个职能部门的人数。在一天结束时,然后将每个功能的总小时数复制并粘贴到另一个表格中,该表格将计算成本和其他指标。在此工作表中,每一列代表一天,因此粘贴范围每天都在变化。

我想在小时跟踪表中放置一个按钮,以将小时数发布到每日表中。所需的脚本将需要根据日期查找粘贴范围。

例如,要复制的范围始终是Hourly!Q6:Q15,今天的粘贴范围是Daily!E6:E15。明天粘贴范围将是Daily!F6:F15,第二天将是Daily!G6:G15,依此类推。

仅应粘贴值,而应忽略格式。

我想出了如何将值从一个位置粘贴到另一个位置,但是碰到了墙,试图将脚本粘贴到可变位置。

非常感谢您的帮助。

        function PasteHours() {
  var ss = SpreadsheetApp.getActive().getSheetByName('NV Hourly');
  var daily = SpreadsheetApp.getActive().getSheetByName("Daily");  
  var data = ss.getDataRange().getValues();
  var date = Utilities.formatDate(new Date(), "GMT+1", "MM/DD/yyyy")

  for(var i = 0; i<data.length;i++){
    if(data[i][1] == date){ 
      Logger.log((i+1))
      return i+1;
    }
  }


  ss.getRange("Q6:Q15").copyValuesToRange(daily, i, i, 6,15)

}

2 个答案:

答案 0 :(得分:0)

我已经稍微修改了您的代码。在这里,我们使用一些“参考”日期,其目标范围是Daily!A6:A15。使用它,我们可以只计算时差并在将来逐步移动目标范围。

function pasteHours() {
  var ss = SpreadsheetApp.getActive().getSheetByName('NV Hourly');
  var daily = SpreadsheetApp.getActive().getSheetByName("Daily");  

  // Copy data to column A at this "reference" date
  var sinceDate = Date.parse('2019-07-15');
  var now = new Date();
  // Time difference in days
  var i = (now.getTime() - sinceDate) / 24000 / 3600;
  i = Math.ceil(i); // round up
  Logger.log(i);

  // Will copy to B6:B15 at 2019-07-16 and so on
  ss.getRange("Q6:Q15").copyValuesToRange(daily, i, i, 6,15);
}

答案 1 :(得分:0)

有两种方法可以解决您的问题:

简单快捷

如果您只想在每次运行脚本时在数据范围的右侧添加新列,则只需使用getLastColumn()在“每日”中找到最后一列:

function PasteHours2() {
      var ss = SpreadsheetApp.getActive().getSheetByName('NV Hourly');
      var daily = SpreadsheetApp.getActive().getSheetByName("Daily");  
      var i=daily.getLastColumn()+1;
      ss.getRange("Q6:Q15").copyValuesToRange(daily, i, i, 6,15) 
     }

遍历日期

这可能就是您想要的。您需要通过以下方式更改代码:

  1. 如果您在列标题(每列的第一行)中注明日期,则将if(data[i][1]...修改为if(data[0][i]...,假设第一个索引是行,第二个索引是列,第一个数组的索引始终为“ 0”。
  2. 我假设数据每天都位于工作表中,而不是ss:var data = daily.getDataRange().getValues();

  3. 您不能直接比较日期-您需要将它们转换为毫秒以进行比较。因此,使用getDate()仅选择日期而不选择日期时间,并使用valueOf()将其转换为毫秒:if(data[0][i].getDate().valueOf() == new Date().getDate().valueOf()){...

  4. 如果满足条件,则将i+1的值分配给辅助变量j

完整代码如下:

function PasteHours3() {
  var ss = SpreadsheetApp.getActive().getSheetByName('NV Hourly');
  var daily = SpreadsheetApp.getActive().getSheetByName("Daily");  
  var data = daily.getDataRange().getValues();
  var date = Utilities.formatDate(new Date(), "GMT+1", "MM/DD/yyyy")

  for(var i = 0; i<data.length;i++){
    if(data[0][i].getDate().valueOf() == new Date().getDate().valueOf()){ 
      Logger.log(("i+1: "+i+1))
      var j=i+1;
    }
  }
  ss.getRange("Q6:Q15").copyValuesToRange(daily, j, j, 6,15)
}

请找到here有关在Java语言中使用日期的更多信息。