Это на самом деле то, с чем у меня было много проблем в прошлом, поэтому я немного поиграл с этим.
Вот код:
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());
}
}
Вот как выглядит моя таблица:
Ссылка на таблицу
В столбце A приведено простое описание каждой строки.
В столбце B указан фактический код в столбце C, а в столбце D
В столбце C естьчисловой формат # 0. ##########
Столбец D имеет числовой формат M / d / гггг
В противном случае столбцы C и D совпадают.
Столбец E Результат метода Javascript Date (). ValueOf ()
Столбец F - это простая функция ячейки, которая добавляет 1 к значению в столбце D каждой строки
Столбцы G и H - это функция isDate () для столбцов C и D. Интересно отметить, что единственная разница между столбцами C и D заключается в форматировании, поэтому я предполагаю, что ISDATE () говорит вам больше о формате ячейки, чемкакой тип объекта находится внутри клетки.
Строка 4 была одним из других ответов на некоторое время, и вы можете видеть, что он возвращает tколичество миллисекунд, и поэтому электронная таблица не знает, что с этим делать. Когда он добавляет один к нему, как это делается в столбце F, он заканчивается простым увеличением количества миллисекунд на единицу.
Строка 5 использует тот же метод, что и в строке 4, но я пропускаю его через конструктор Date () одинбольше времени, и он возвращает хороший объект даты, который электронная таблица с радостью превращает в один из своих объектов Date, а в столбцах C и D он продолжает правильно отображать значения в виде числа в одном случае и даты в другом. Кроме того, кажется, что он хорошо работает с другими функциями электронных таблиц, как и в столбце F., генерируя дату следующих дней.
Надеюсь, это поможет вам. Я знаю, что научился немного, делая это. Если у вас есть дополнительные вопросы, пожалуйста, не стесняйтесь спрашивать.