繁体   English   中英

如何通过使用 arrays 从 Google 表格中提取数据并格式化来优化 Apps 脚本代码?

[英]How to optimise Apps Script code by using arrays to pull data from Google Sheets and format it?

我有一个脚本,它从 gsheet 中获取数据并替换 gdoc 上的占位符。 我希望通过使用 arrays 来优化脚本。

这是我的 gsheet 示例(原始 gsheet 跨越 1000+ 行和 15+ 列),

样本 gsheet

原脚本:

function generategdoc() {

  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").activate();

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lr = ss.getLastRow();

  for (var i =2;i<=lr;i++){

    if(ss.getRange(i, 1).getValue()){    

  //Make a copy of the template file
  var documentId = DriveApp.getFileById('FileID').makeCopy().getId();

  var Client = ss.getRange(i, 2).getValue();
  var Amount = ss.getRange(i, 3).getValue();
    var AmountFormat = Amount.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');  

  var Date = ss.getRange(i, 4).getValue();
    var temp = new Date(Date)
    var DateFormat = Utilities.formatDate(temp, "GMT+0400", "dd MMM yyyy")

  //Rename the copied file
  DriveApp.getFileById(documentId).setName(Client);  

  //Get the document body as a variable
  var body = DocumentApp.openById(documentId).getBody();

  body.replaceText('##Client##', Client).replaceText('##Amount##', AmountFormat).replaceText('##Date##', DateFormat)
    }
    else {}
  }
}

如您所见,此脚本将仅针对已选中 TRUE 的所有行运行。

尝试1优化:

function optimise() {

  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1").activate();

  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lr = ss.getLastRow();

  var rng = ss.getRange("A1:"+"D"+lr).getValues();  //Creation of Array

  for (var i =2;i<=lr;i++){

    if(ss.getRange(i, 1).getValue()){
      var Client = rng[i-1][1];
      var Amount = rng[i-1][2];
      var Date = rng[i-1][3];

  var documentId = DriveApp.getFileById('FileID').makeCopy().getId();

      DriveApp.getFileById(documentId).setName(Client);  

  var body = DocumentApp.openById(documentId).getBody();
      body.replaceText('##Client##', Client).replaceText('##Amount##', Amount).replaceText('##Date##', Date)
          }
    else {}
  }
}

问题:
我能够为AmountDate格式化原始脚本。 如何为 arrays 设置相同的格式? 因为我不能formatDate (类实用程序)toFixed应用于我的变量,因为它们现在是 arrays。

你可以尝试这样的事情。 但这可能没有任何区别,因为创建文件需要很长时间。

function optimise() {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var vA= ss.getRange(1,1,ss.getLastRow(),4).getValues();
  var file = DriveApp.getFileById('FileID');
  for(var i=0;i<vA.length;i++){
    if(vA[i][0]){
      var Client=vA[i][1];
      var Amount=vA[i][2];
      var Date=vA[i][3];
      DriveApp.getFileById(file.makeCopy().getId()).setName(Client);  
      var body=DocumentApp.openById(documentId).getBody();
      body.replaceText('##Client##', Client).replaceText('##Amount##', Amount).replaceText('##Date##', Date)
    }
  }
}

我想知道您是否需要 saveAndClose() 文档。

我相信您可以通过使用适当的方法来优化您的代码,以保留您的 Google 工作表值的文本格式。

SpreadsheetApp服务中查看使用 class Range的以下方法。

方法getDisplayValue()返回区域中单元格的显示值。 该值是一个字符串。 显示的值考虑了日期、时间和货币格式,包括由电子表格的区域设置自动应用的格式。 空单元格返回一个空字符串。

这应该通过消除正则表达式的必要性来优化您的代码。 如果我没有正确理解您的问题,请发表评论。


参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM