格式化纯文本到日期
Format plain text to date
目标
编写执行以下操作的脚本:
- 从sheet
获取数据
- 修改列以将姓名从 [Last, First] 翻转为 [First Last]
- 修改 2 列以缩写公司名称和状态
- 将结果数据写入另一个传播sheet而不改变格式
- 添加数据复制时间戳
问题
我可以获取数据,但它会将所有内容以纯文本形式写回。因此,日期不是写成 "yyyy-MM-dd"
,而是写成这样:
Mon Oct 19 2020 01:00:00 GMT-0400(东部夏令时)
期望:
screenshot of dates as "yyyy-MM-dd"
结果:
screenshot of dates as whatever this garble is
我已经 google 进行了广泛的研究,但似乎找不到解决方案。我相信我的问题是在 Array.map 中使用 toString()
。我不确定如何将 map 方法限制为仅需要修改的列。现在它影响整个阵列。
(我使用了的代码来写这部分)
//-----FIND AND REPLACE FOR COMPANY & STATUS ABBREVIATIONS
function replaceInSheet(initArray, to_replace, replace_with){
//Loop over rows in array
for(var row in initArray ){
//Use Array.map to execute a replace call on each of the cells in the row.
var replaced_values = initArray[row].map(function(originalValue){
return originalValue.toString().replace(to_replace,replace_with);
});
//Replace the original row values with the replaced values
initArray[row] = replaced_values;
}
}
问题-->如何让我的脚本输出正确地格式化我的两列中的日期?
尝试过的解决方案无效
- 我尝试在缩写代码之后交换名称翻转代码,这样我就可以在名称翻转循环中添加一个
setNumberFormat('yyyy-MM-dd')
。我不知道如何将它应用到我的数组中的列。 initarray[x][5].setNumberFormat("yyyy-MM-dd")
之类的东西给我一个错误,说“TypeError: initArrayx.setNumberFormat is not a function”
- 我尝试在最后
.setValues()
之前(甚至之后)添加代码来更改格式。我参考的一些资源:
setNumberFormat('yyyy-MM-dd')
来自
Utilities.formatDate(new Date(), "CST", "yyyy-MM-dd")
来自 Whosebug: Get today date in google appScript
- website post by BLACKCJ: "Cell Number Formatting with Google Apps Script"
- google's developer documentation
- 以及各种其他文章、博客、论坛等
- 我尝试编写一个完全独立的函数来在我的脚本运行后更改格式。没有。我无法将这两列格式化为日期
代码和示例传播sheet
这是我正在使用的全部代码,经过修改后可用于示例 google sheet 我为这个问题创建的。
示例 Google Sheet:
https://docs.google.com/spreadsheets/d/1Ys77hQHHajIo-Xaxyom0SVnyVMZ6bKOT8Smpadd2jv4/edit?usp=sharing
脚本:
// ==================================================
// FUNCTION TO RUN
// ==================================================
function syncData(){
//Ger Source Data
var ss = SpreadsheetApp.getActiveSpreadsheet();
var thisSheet = ss.getSheetByName("source");
var thisData = thisSheet.getRange("A4:M11");
var initArray = thisData.getValues();
//Get Target Location
var toSheet = ss.getSheetByName("target");
var toRange = toSheet.getRange("A4:M11"); //Range starts at A4
//CHANGE [LAST, FIRST] TO [FIRST LAST]
for (var x = 0; x < initArray.length; x++){
var indexOfFirstComma = initArray[x][0].indexOf(", ");
if(indexOfFirstComma >= 0){
//If comma found, split and update values in the values array
var lastAndFirst = initArray[x][0];
//Update name value in array
initArray[x][0] = lastAndFirst.slice(indexOfFirstComma + 2).trim() + " " + lastAndFirst.slice(0, indexOfFirstComma).trim();
}
}
//ABBREVIATE COMPANY
replaceInSheet(initArray, 'Bluffington School','BLF HS');
replaceInSheet(initArray, 'Honker Burger','HBGR');
replaceInSheet(initArray, 'Funky Town','FT');
//ABBRIVIATE STATUS
replaceInSheet(initArray, 'Regular','Staff');
replaceInSheet(initArray, 'Contractual','Part');
replaceInSheet(initArray, 'Temporary','Temp');
//Clear Target Location
var toClear = toSheet.getRange("A4:M11")
toClear.clearContent();
//Write updated array to target location
toRange.setValues(initArray);
//Write timestamp of when code was last run
setTimeStamp(toSheet);
}
//-----FIND AND REPLACE FOR COMPANY & STATUS ABBREVIATIONS
function replaceInSheet(initArray, to_replace, replace_with){
//Loop over rows in array
for(var row in initArray ){
//Use Array.map to execute a replace call on each of the cells in the row.
var replaced_values = initArray[row].map(function(originalValue){
return originalValue.toString().replace(to_replace,replace_with);
});
//Replace the original row values with the replaced values
initArray[row] = replaced_values;
}
}
//-----ADD TIMESTAMP FOR WHEN THE SCRIPT LAST RAN
function setTimeStamp(toSheet) {
var timestamp = Utilities.formatDate(new Date(), "CST", "yyyy-MM-dd @ h:mm a");
toSheet.getRange('F1').setValue(timestamp);
}
setNumberFormat('yyyy-MM-dd')
是一个很好的解决方案,但它是 sheet 范围的一种方法。不是数组。
要应用您需要先获取范围的格式。像这样:
toSheet.getRange('G4:G').setNumberFormat('yyyy-MM-dd');
还有一件事 ) 尝试更改此行:
var initArray = thisData.getValues();
至:
var initArray = thisData.getDisplayValues();
目标
编写执行以下操作的脚本:
- 从sheet 获取数据
- 修改列以将姓名从 [Last, First] 翻转为 [First Last]
- 修改 2 列以缩写公司名称和状态
- 将结果数据写入另一个传播sheet而不改变格式
- 添加数据复制时间戳
问题
我可以获取数据,但它会将所有内容以纯文本形式写回。因此,日期不是写成 "yyyy-MM-dd"
,而是写成这样:
Mon Oct 19 2020 01:00:00 GMT-0400(东部夏令时)
期望: screenshot of dates as "yyyy-MM-dd"
结果: screenshot of dates as whatever this garble is
我已经 google 进行了广泛的研究,但似乎找不到解决方案。我相信我的问题是在 Array.map 中使用 toString()
。我不确定如何将 map 方法限制为仅需要修改的列。现在它影响整个阵列。
(我使用了
//-----FIND AND REPLACE FOR COMPANY & STATUS ABBREVIATIONS
function replaceInSheet(initArray, to_replace, replace_with){
//Loop over rows in array
for(var row in initArray ){
//Use Array.map to execute a replace call on each of the cells in the row.
var replaced_values = initArray[row].map(function(originalValue){
return originalValue.toString().replace(to_replace,replace_with);
});
//Replace the original row values with the replaced values
initArray[row] = replaced_values;
}
}
问题-->如何让我的脚本输出正确地格式化我的两列中的日期?
尝试过的解决方案无效
- 我尝试在缩写代码之后交换名称翻转代码,这样我就可以在名称翻转循环中添加一个
setNumberFormat('yyyy-MM-dd')
。我不知道如何将它应用到我的数组中的列。initarray[x][5].setNumberFormat("yyyy-MM-dd")
之类的东西给我一个错误,说“TypeError: initArrayx.setNumberFormat is not a function” - 我尝试在最后
.setValues()
之前(甚至之后)添加代码来更改格式。我参考的一些资源:setNumberFormat('yyyy-MM-dd')
来自Utilities.formatDate(new Date(), "CST", "yyyy-MM-dd")
来自 Whosebug: Get today date in google appScript- website post by BLACKCJ: "Cell Number Formatting with Google Apps Script"
- google's developer documentation
- 以及各种其他文章、博客、论坛等
- 我尝试编写一个完全独立的函数来在我的脚本运行后更改格式。没有。我无法将这两列格式化为日期
代码和示例传播sheet
这是我正在使用的全部代码,经过修改后可用于示例 google sheet 我为这个问题创建的。
示例 Google Sheet:
https://docs.google.com/spreadsheets/d/1Ys77hQHHajIo-Xaxyom0SVnyVMZ6bKOT8Smpadd2jv4/edit?usp=sharing
脚本:
// ==================================================
// FUNCTION TO RUN
// ==================================================
function syncData(){
//Ger Source Data
var ss = SpreadsheetApp.getActiveSpreadsheet();
var thisSheet = ss.getSheetByName("source");
var thisData = thisSheet.getRange("A4:M11");
var initArray = thisData.getValues();
//Get Target Location
var toSheet = ss.getSheetByName("target");
var toRange = toSheet.getRange("A4:M11"); //Range starts at A4
//CHANGE [LAST, FIRST] TO [FIRST LAST]
for (var x = 0; x < initArray.length; x++){
var indexOfFirstComma = initArray[x][0].indexOf(", ");
if(indexOfFirstComma >= 0){
//If comma found, split and update values in the values array
var lastAndFirst = initArray[x][0];
//Update name value in array
initArray[x][0] = lastAndFirst.slice(indexOfFirstComma + 2).trim() + " " + lastAndFirst.slice(0, indexOfFirstComma).trim();
}
}
//ABBREVIATE COMPANY
replaceInSheet(initArray, 'Bluffington School','BLF HS');
replaceInSheet(initArray, 'Honker Burger','HBGR');
replaceInSheet(initArray, 'Funky Town','FT');
//ABBRIVIATE STATUS
replaceInSheet(initArray, 'Regular','Staff');
replaceInSheet(initArray, 'Contractual','Part');
replaceInSheet(initArray, 'Temporary','Temp');
//Clear Target Location
var toClear = toSheet.getRange("A4:M11")
toClear.clearContent();
//Write updated array to target location
toRange.setValues(initArray);
//Write timestamp of when code was last run
setTimeStamp(toSheet);
}
//-----FIND AND REPLACE FOR COMPANY & STATUS ABBREVIATIONS
function replaceInSheet(initArray, to_replace, replace_with){
//Loop over rows in array
for(var row in initArray ){
//Use Array.map to execute a replace call on each of the cells in the row.
var replaced_values = initArray[row].map(function(originalValue){
return originalValue.toString().replace(to_replace,replace_with);
});
//Replace the original row values with the replaced values
initArray[row] = replaced_values;
}
}
//-----ADD TIMESTAMP FOR WHEN THE SCRIPT LAST RAN
function setTimeStamp(toSheet) {
var timestamp = Utilities.formatDate(new Date(), "CST", "yyyy-MM-dd @ h:mm a");
toSheet.getRange('F1').setValue(timestamp);
}
setNumberFormat('yyyy-MM-dd')
是一个很好的解决方案,但它是 sheet 范围的一种方法。不是数组。
要应用您需要先获取范围的格式。像这样:
toSheet.getRange('G4:G').setNumberFormat('yyyy-MM-dd');
还有一件事 ) 尝试更改此行:
var initArray = thisData.getValues();
至:
var initArray = thisData.getDisplayValues();