javascript - 加速脚本 Gscript
问题描述
我正在寻找一种方法来提高我的代码的性能。
我的函数必须将字符串日期格式: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.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");
我已经在这里阅读了最佳实践:https ://developers.google.com/apps-script/guides/support/best-practices
但我不知道如何在我的功能中应用这些方法。
如果有人能够在某些方面纠正我,那可能会非常有用!
真挚地,
大班尼
解决方案
您的脚本运行缓慢,因为用户一次写入一个单元格。使用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);
}
请注意,此函数实际上不会将值转换为日期,而是转换为看起来像日期的文本字符串。要获得真实的数字日期,请通过格式 > 数字 > 日期或您选择的自定义数字格式return new Date(annee, mois - 1, jour);
在电子表格中使用和格式化结果。
有关日期和时间值如何在电子表格中工作的说明,请参阅此答案。
推荐阅读
- django - 子查询中的左外连接
- bixby - 如何为胶囊添加导航支持
- javascript - 如何在 json (javascript) 中使用变量作为对象
- java - 无法从链中的任何提供商加载 AWS 凭证 - kinesis-kafka-connector
- regex - "\S+?@\S+" 和 "\S+@\S+" 在正则表达式中给出相同的输出
- angular - Angular 7 终于不起作用了
- php - 如何在 PHP REST 网站中实现 RS512 或更高的安全算法?
- rust - 接受 HashMap 和 BtreeMap 的 Rust 函数
- angular - 我应该先制作 Angular Web 项目,然后将其转换为移动设备吗?
- ruby-on-rails - Rails 5:设计可邀请的添加自定义字段