这实际上是我过去遇到很多麻烦的事情,所以我玩了一下。
代码如下:
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 列中通过生成第二天日期一样。