Javascript 加速脚本Gscript
我正在寻找一种提高代码性能的方法 我的函数必须将字符串日期格式:20200208转换为08/02/2020Javascript 加速脚本Gscript,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正在寻找一种提高代码性能的方法 我的函数必须将字符串日期格式:20200208转换为08/02/2020 function convertToDate(sheet,col){ var s = sheet; var col = col; var newVal = new Array(); var oldVal = s.getRange(2,col,s.getLastRow()-1).getDisplayValues(); for (var i =0;i<=oldVal.
function convertToDate(sheet,col){
var s = sheet;
var col = col;
var newVal = new Array();
var oldVal = s.getRange(2,col,s.getLastRow()-1).getDisplayValues();
for (var i =0;i<=oldVal.length-1;i++){
var val = oldVal[i].toString();
var annee = val.slice(0,4);
var mois = val.slice(4,6);
var jour = val.slice(6,8);
//Logger.log(" Day: " + jour + "\nMonth : "+mois + "\nYear: "+annee);
var update = Utilities.formatDate(new Date(annee,mois-1,jour),Session.getScriptTimeZone(),"dd/MM/yyyy");
newVal.push(update);
//Logger.log(newVal[i])
}
for (var j = 2; j<= s.getLastRow();j++){
s.getRange(j,col).setValue(newVal[j-2]);
}
return Logger.log("end");
函数转换日期(表、列){
var s=表;
var col=col;
var newVal=新数组();
var oldVal=s.getRange(2,col,s.getLastRow()-1);
对于(var i=0;i,我只是找到了一种更有效的方法来做我想做的事情
我只是删除了第二个for循环,它是无用的,所以我
s.getRange(i-2,col).setValue(newVal[i]);
进入第一个for循环。您的脚本运行缓慢,因为use正在一次写入一个单元格。请使用setValues()
而不是setValue()
一次性写入所有单元格。尝试以下操作:
function convertToDate(sheet, column) {
const firstRow = 2;
const range = sheet.getRange(firstRow, column, sheet.getLastRow() - firstRow + 1, 1);
const dateFormat = 'dd/MM/yyyy';
const timezone = sheet.getParent().getSpreadsheetTimeZone();
const newValues = range
.getDisplayValues()
.map(row => row.map(string => {
const annee = string.slice(0, 4);
const mois = string.slice(4, 6);
const jour = string.slice(6, 8);
return Utilities.formatDate(new Date(annee, mois - 1, jour), timezone, dateFormat);
}));
range.setValues(newValues);
}
请注意,此函数实际上不会将值转换为日期,而是转换为类似日期的文本字符串。若要获取真正的数字日期,请使用返回新日期(annee,mois-1,jour);
并通过格式>数字>日期或您选择的自定义数字格式在电子表格中格式化结果
有关日期和时间值如何在电子表格中工作的说明,请参阅。我确信它将以大约相同的速度工作。在循环中不应使用setValue()
方法。必须先创建一个数组,然后使用setValues(array)
方法设置多个单元格。每次调用setValue()
可能需要大约半秒钟的时间。感谢您的帮助,这是一项非常好的工作。在尝试将数据从电子表格复制到另一个电子表格时,如果范围不匹配,我通常会对范围错误感到恼火。我想这是您在Stack Exchange上的第一个问题。请参阅