Javascript 如何从列中提取单个数据并使用它命名文档?

Javascript 如何从列中提取单个数据并使用它命名文档?,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我目前在大学工作,所以我对javascript的知识有限,我对电子表格和数据库的经验更是有限,所以如果有一个非常简单的解决方案,我很抱歉 我的谷歌工作表充当我在工作中制作的应用程序的数据库。此数据库中有多个工作表,每个工作表都是根据特定位置(siteID)定制的,即siteID列中的每个单元格都包含相同的名称 我正在编写一个脚本,该脚本从工作表中获取数据,并将t应用于模板以创建google文档。脚本的这一部分正在运行 命名模板相当简单,因为siteID列在每行中包含相同的数据,这意味着我只需要从

我目前在大学工作,所以我对javascript的知识有限,我对电子表格和数据库的经验更是有限,所以如果有一个非常简单的解决方案,我很抱歉

我的谷歌工作表充当我在工作中制作的应用程序的数据库。此数据库中有多个工作表,每个工作表都是根据特定位置(siteID)定制的,即siteID列中的每个单元格都包含相同的名称

我正在编写一个脚本,该脚本从工作表中获取数据,并将t应用于模板以创建google文档。脚本的这一部分正在运行

命名模板相当简单,因为siteID列在每行中包含相同的数据,这意味着我只需要从列中的第一个单元格获取siteID

这将导致每个文档具有相同的名称

我想用我的tagNO。列来分隔每个新文档。标记号是存储在我的数据库中的机器的唯一标识符,因此使用特定数据生成的每个文档都将具有相同的siteID,后跟唯一的标记号

由于我的脚本现在已经存在,为了命名一个文档,我只需要从siteID列的第一个单元格中取出数据,对于tagNO也是如此。专栏。我要么拿着塔格诺。来自此列中的第一个单元格,或来自此列中的每个单元格,生成siteID和一长串标记号

所以我的问题是,有没有一种方法可以从我的tagNO中单独提取一个单元格。列并将其应用于文档,然后查看存储这些文档的文件夹,以确保列中的下一个单元格尚未链接文档

这就是我用来从siteID列中的第一个单元格获取数据的方法

var docTitle = sheet.getRange(2,2,11,1).getValue();  
我用tagNo试过这个方法。col,但这导致了tagNo的长字符串。显示在每个生成的文档上

这是整个脚本

function onOpen(){
  var menuEntries = [{name: "Create Template", functionName: "createTemplate"}];
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.addMenu("Template Generator", menuEntries);
}

function createTemplate(){
  var sleepInt = 1500;
  var templateId = "1uSAcH8F21zEjuprIcE2_d84ojQT24ek85Y1W6L17Xno"; 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  ss.toast("starting");
  Utilities.sleep(sleepInt);
  var sheet = ss.getActiveSheet();
  var data = sheet.getRange(2, 2, 11, 18).getValues();
  ss.toast("created document and adding data");
  Utilities.sleep(sleepInt);

  for(var i in data){
    var row = data[i];
    var docId = DriveApp.getFileById(templateId).makeCopy().getId();
    var doc = DocumentApp.openById(docId);
    var body = doc.getActiveSection();
    body.replaceText("%SITEID%", row[0]);
    body.replaceText("%TAG%", row[1]);
    body.replaceText("%CATEGORY%", row[2]);
    body.replaceText("%DESCRIPTION%", row[3]);
    body.replaceText("%AREA%", row[4]);
    body.replaceText("%SERIALNO%", row[5]);
    body.replaceText("%MODEL%", row[6]);
    body.replaceText("%MANUAL%", row[7]);
    body.replaceText("%HOOKUP%", row[8]);
    body.replaceText("%WEB%", row[9]);
    //body.replaceText("Checks", row[10]);
    body.replaceText("%CONNECTED%", row[11]);
    body.replaceText("%CALIBRATED%", row[12]);
    body.replaceText("%AUTOMATED%", row[13]);
    body.replaceText("%SAT%", row[14]);
    body.replaceText("%SIGNED%", row[16]);

    doc.saveAndClose();

    ss.toast("added data");
    Utilities.sleep(sleepInt);

    var file = DriveApp.getFileById(doc.getId());
    var newFolder = DriveApp.getFolderById("16wRGBVdV0OZ5YfKhqEQSFMsux-ekGCCa");
    newFolder.addFile(file); 

    ss.toast("finished");
    Utilities.sleep(sleepInt);

    //customise the title for document
    var docTitle = sheet.getRange(2, 2, 11, 1).getValue(); //this is grabbing the data in field B2
    var docTitleTag = sheet.getRange(2, 3, 12, 18).getValue();
    var name = doc.getName();
    var today = new Date();
    var dd = today.getDate();
    var mm = today.getMonth() + 1;
    var yyyy = today.getFullYear();
    today = dd + '/' + mm + '/' + yyyy;
    doc.setName(docTitle + " " + docTitleTag + " " + today);

    ss.toast("Named the document");
    Utilities.sleep(sleepInt);

    var pdffolder = DriveApp.getFolderById("16wRGBVdV0OZ5YfKhqEQSFMsux-ekGCCa");
    var pdfFILE = DriveApp.getFileById(doc.getId()).getAs('application/pdf');
    pdfFILE.setName(doc.getName() + ".pdf");
    var theFolder = pdffolder;
    var theFile = DriveApp.createFile(pdfFILE);
    theFolder.addFile(theFile);

    ss.toast("Generated PDF");
    Utilities.sleep(sleepInt); 
  }
}
这就是我用来命名文档的名称。 第二行是我的问题所在。 目前,该行从标记号中提取第一个单元格。col并将其应用于脚本创建的每个文档

var docTitle = sheet.getRange(2,2,11,1).getValue(); 
var docTitleTagNumber = sheet.getRange(2, 3,11, 1).getValue();
var name = doc.getName();
var today = new Date();
var dd = today.getDate();
var mm = today.getMonth() + 1;
var yyyy = today.getFullYear();
today = dd + '/' + mm + '/' + yyyy;
doc.setName(docTitle + " " + today);

我相信您的问题在于如何使用
getRange
getValue
在这种情况下,当使用
getRange
时,参数是
getRange([行数]、[列数]、[行数]、[列数])
这意味着您在执行
getRange>操作时从第3列的第2行开始抓取11行(2,3,11,1)
这很好,但是当你在这个范围内执行
.getValue()
时,它只会从这个范围返回一个值。这对你的
var docTitle
有效,因为你的所有值都是相同的,因此你不会注意到它实际上只提取了一个值

通过使用
.getValues()可以达到迭代每个ID所需的效果
返回该范围中的二维值数组。然后,您可以使用
for
循环在每次循环运行时遍历该数组以获取每个标记号。事实上,由于代码已经位于
for
循环中(假设它与您在标记号列中的行重复相同次数)您可能不必使用单独的for循环

我建议先改变这两行

var docTitle = sheet.getRange(2,2,11,1).getValue(); 
var docTitleTagNumber = sheet.getRange(2, 3,11, 1).getValue();

然后将变量声明的整个块(除了
var name
)移动到
for
循环上方,这样代码运行得更快(不必执行
.getRange
或每次循环迭代时重新计算日期),就像这样

最后,在前面的声明中,您可以放置类似于以下内容的内容(当然,使用适合您的变量名,这只是一个示例)

这将使用
i
遍历第一列(仅在本例中)中的每一行,如果您相应地更改下面的其他变量名称,则将使用您创建的每个新文档名称中的变量名称

var docTitle = sheet.getRange(2,2,11,1).getValues(); 
var docTitleTagNumber = sheet.getRange(2, 3,11, 1).getValues();
. . .
var sheet = ss.getActiveSheet();
var data = sheet.getRange(2, 2, 11, 18).getValues();
ss.toast("created document and adding data");
Utilities.sleep(sleepInt)

var docTitle = sheet.getRange(2,2,11,1).getValues(); 
var docTitleTagNumber = sheet.getRange(2, 3,11, 1).getValues();
var today = new Date();
var dd = today.getDate();
var mm = today.getMonth() + 1;
var yyyy = today.getFullYear();
today = dd + '/' + mm + '/' + yyyy;

for(var i in data){
  var row = data[i];
. . .
var newDocTitle = docTitle[i][0];
var newDocTitleTagNumber = docTitleTagNumber[i][0];