我目前正在大学实习,所以我对 javascript 的了解有限,我在电子表格和数据库方面的经验更加有限,所以如果有一个非常简单的解决方案,我深表歉意。
我的 Google 表格充当我在工作中制作的应用程序的数据库。该数据库中有多个工作表,每个工作表都针对特定位置(siteID)量身定制,即 siteID 列中的每个单元格都包含相同的名称。
我正在编写一个脚本,该脚本从工作表中获取数据并将 t 应用于模板以创建谷歌文档。脚本的这一部分正在运行。
命名模板非常简单,因为 siteID 列在每一行中包含相同的数据,这意味着我只需要从列中的第一个单元格中获取 siteID。
这导致每个文档具有相同的名称。
我想使用我的标签号。列来分隔每个新文档。标记号是存储在我的数据库中的机器的唯一标识符,因此使用特定数据生成的每个文档都将具有相同的 siteID,后跟唯一的标记号。
正如我的脚本现在所处的那样,要命名一个文档,我只需要从 siteID 列的第一个单元格中取出数据,同样的事情也适用于 tagNO。柱子。我可以选择 tagNO。来自此列中的第一个单元格,或来自此列中的每个单元格,生成站点 ID 和一长串标记号。
所以我的问题是,有没有一种方法可以从我的 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);
}
}
这就是我用来命名文档的内容。 第二行是我的问题所在。 目前这条线正在从 tagNO 中获取第一个单元格。 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([row number],[column number],[number of rows],[number of columns])
这意味着当您执行 时,您将从第 3 列的第 2 行开始获取 11 行getRange(2, 3,11, 1)
这一切都很好,但是当你在该范围内执行 .getValue()
时,它只会返回一个值那个范围。这适用于您的 var docTitle
,因为您的所有值都相同,因此您不会注意到它实际上只提取一个值。
为了达到遍历每个 ID 的预期效果,您可以使用 .getValues()
返回范围内的二维值数组。然后,您可以使用 for
循环遍历此数组,以便在每次循环运行时获取每个标记号。事实上,由于代码已经位于 for
循环中(假设它迭代的次数与您在 Tag Number 列中的行相同),您可能不必使用单独的 for 循环.
我建议首先更改这两行
var docTitle = sheet.getRange(2,2,11,1).getValue();
var docTitleTagNumber = sheet.getRange(2, 3,11, 1).getValue();
到
var docTitle = sheet.getRange(2,2,11,1).getValues();
var docTitleTagNumber = sheet.getRange(2, 3,11, 1).getValues();
然后将变量声明的整个 block (var name
除外)移动到 for
循环之上,以便代码运行得更快(它不必这样做.getRange
或每次循环迭代时重新计算日期)像这样
. . .
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];
这将使用 i
遍历第一列(在本例中仅)中的每一行,如果您相应地更改下面的其他变量名称,将使用名称中的那些您创建的新文档。
关于javascript - 我如何从列中提取单个数据并使用它来命名文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57492922/