【发布时间】:2020-08-20 15:45:01
【问题描述】:
我有一个脚本,它从 gsheet 中获取数据并替换 gdoc 上的占位符。我希望通过使用数组来优化脚本。
这是我的 gsheet 示例(原始 gsheet 跨越 1000+ 行和 15+ 列),
原文:
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 {}
}
}
问题:
我能够为Amount 和Date 格式化原始脚本。如何对数组使用相同的格式?因为我不能再将formatDate(class utilities) 和toFixed 应用于我的变量,因为它们现在是数组。
【问题讨论】:
-
因为 formatDate 和 toFixed 是 Class Range 的方法。 你为什么这么说?提供此声明的文件
-
我已经更新了声明——我的意思是说我不能应用 formatDate 和 toFixed 方法。我还更新了问题,改为问一个。
-
根据您的文档链接,所有参数都不需要
range类型。它们属于Date和string类型。您的数组类型是object[][](如getValues()文档中所述),它由Date和string类型组成。没有任何迹象表明您不能将formatDate()应用于数组内的值。 -
是的,你是对的,我不应该假设。这是我应该使用的
getDisplaceValues()。感谢您的耐心和指导。我很欣赏你的教学道德@TheMaster!
标签: javascript arrays google-apps-script optimization google-sheets