首页 > 解决方案 > 加速脚本 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

但我不知道如何在我的功能中应用这些方法。

如果有人能够在某些方面纠正我,那可能会非常有用!

真挚地,

大班尼

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


您的脚本运行缓慢,因为用户一次写入一个单元格。使用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);在电子表格中使用和格式化结果。

有关日期和时间值如何在电子表格中工作的说明,请参阅此答案。


推荐阅读