我有一张工作表,用于追踪人工成本,每小时有人输入每个职能部门的人数。在一天结束时,然后将每个功能的总小时数复制并粘贴到另一个表格中,该表格将计算成本和其他指标。在此工作表中,每一列代表一天,因此粘贴范围每天都在变化。
我想在小时跟踪表中放置一个按钮,以将小时数发布到每日表中。所需的脚本将需要根据日期查找粘贴范围。
例如,要复制的范围始终是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)
}
答案 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)
}
遍历日期
这可能就是您想要的。您需要通过以下方式更改代码:
if(data[i][1]...
修改为if(data[0][i]...
,假设第一个索引是行,第二个索引是列,第一个数组的索引始终为“ 0”。我假设数据每天都位于工作表中,而不是ss:var data = daily.getDataRange().getValues();
您不能直接比较日期-您需要将它们转换为毫秒以进行比较。因此,使用getDate()
仅选择日期而不选择日期时间,并使用valueOf()
将其转换为毫秒:if(data[0][i].getDate().valueOf() == new Date().getDate().valueOf()){...
如果满足条件,则将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语言中使用日期的更多信息。