Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 加速脚本Gscript_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 加速脚本Gscript

Javascript 加速脚本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.

我正在寻找一种提高代码性能的方法

我的函数必须将字符串日期格式: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");


函数转换日期(表、列){
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上的第一个问题。请参阅