问题描述
我在前几年使用 AppsScripts 使用 GoogleSheets 为简单任务制作了一些函数。从单元格/范围中获取日期并处理它们时,我总是遇到问题,但不知何故总是找到了解决方法,因此我不必处理它。好吧,这次我找不到解决方法,所以我将尝试用以下代码解释我的问题:
function getDates(){
var s = SpreadsheetApp.getActiveSpreadsheet();
var sht = s.getSheetByName('Dates');
var date = sht.getRange(2,1).getValues();
Logger.log(date[0][0]); //output is Tue Jun 08 18:00:00 GMT-04:00 2021
var datumFilter= Utilities.formatDate(date[0][0],"GMT+1","dd/mm/yy");
Logger.log(datumFilter); //output is 08/00/21
var outrng = sht.getRange(25,1);
outrng.setValue(date);
}
第一个目标单元格(“var date”)在电子表格中的值为“9.6.21”。单元格格式为日期,双击时会打开日历。当我设置新的单元格值(使用 'outrng.setValue(date);')时,结果正常,日期与原始单元格中的日期相同。
但我不需要简单地传输值,我想在一些循环中实现它们,我不知道如何简单地以相同的格式或至少在脚本中获取相同日期的日期细胞。正如您从记录器中看到的,那里的值是不同的。一个简单的 d/m/yy 格式就足够了。
我的电子表格设置设为我的当地时间(斯洛文尼亚,GMT+1)。
我猜我在这里遗漏了一些基础知识。我花了很多时间试图理解它,所以非常感谢任何帮助!
解决方法
Cooper 已经在评论中回答了您的所有问题。我想添加并向您展示一个示例,说明它想要什么并添加一些修改。
代码:
function getDates() {
var s = SpreadsheetApp.getActiveSpreadsheet();
var sht = s.getSheetByName('Dates');
// get last row of the sheet
var lastRow = sht.getLastRow();
// get your sheet's timezone
var timezone = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
var output = [];
// getValues is mostly used for multiple cells returning a 2D array
// use getValue for single cells to return its actual value
// but since function name is getDates,I assume column A is all dates
// so we fetch the whole column (A2:A[lastRow]) except the header
var dates = sht.getRange("A2:A" + lastRow).getValues();
// for each date on that column,we format the date to d/M/yy
// m/mm = minute
// M/MM = month
dates.forEach(function ([date]){
Logger.log(date);
var datumFilter= Utilities.formatDate(new Date(date),timezone,"d/M/yy");
Logger.log(datumFilter);
// collect all dates in an array
output.push([datumFilter]);
});
// assign all the dates in the array onto range B2:B
sht.getRange(2,2,output.length,1).setValues(output);
}
示例数据:
日志:
输出:
注意:
- 由于我的工作表的格式,工作表上的输出不等于日志。