尝试为Google工作表中的每一行创建多个PDF

尝试为Google工作表中的每一行创建多个PDF,pdf,google-apps-script,google-sheets,Pdf,Google Apps Script,Google Sheets,我正在尝试使用谷歌文档作为模板,为谷歌工作表中的每一行创建一个单独的PDF。当我使用活动行时,我可以让它工作;但是,当我尝试循环createpdf函数时,唯一剩下的PDF是最后一行。我的想法是,我会事先删除所有文件,但我不知道错误在哪里。任何帮助都会很棒 var TEMPLATE_ID = '1Mxrm0kny8R7ROlBou8kSUc8dOvvH8PvtQ-EC_Nd3FUQ'; function onOpen() { SpreadsheetApp .getUi() .crea

我正在尝试使用谷歌文档作为模板,为谷歌工作表中的每一行创建一个单独的PDF。当我使用活动行时,我可以让它工作;但是,当我尝试循环createpdf函数时,唯一剩下的PDF是最后一行。我的想法是,我会事先删除所有文件,但我不知道错误在哪里。任何帮助都会很棒

var TEMPLATE_ID = '1Mxrm0kny8R7ROlBou8kSUc8dOvvH8PvtQ-EC_Nd3FUQ';

function onOpen() {

 SpreadsheetApp
  .getUi()
  .createMenu('Create PDF')
  .addItem('Create PDF', 'createPdf')
  .addToUi();
} 

for (var i=2; i < 3; i++) { function createPdf() {

  if (TEMPLATE_ID === '') {

  SpreadsheetApp.getUi().alert('TEMPLATE_ID needs to be defined in code.gs');
  return;
 }

// Set up the docs and the spreadsheet access

var copyFile = DriveApp.getFileById(TEMPLATE_ID).makeCopy(),
   copyId = copyFile.getId(),
   copyDoc = DocumentApp.openById(copyId),
   copyBody = copyDoc.getBody(),
   activeSheet = SpreadsheetApp.getActiveSheet(),
   numberOfColumns = activeSheet.getLastColumn(),
   activeRow = activeSheet.getRange(i, 1, 1, numberOfColumns).getValues(),
   headerRow = activeSheet.getRange(1, 1, 1, numberOfColumns).getValues(),
   columnIndex = 0,
   fileName =  activeRow[0][0] + activeRow[0][1],
   pdfFile,
   pdfFile2;

 // Replace the keys with the spreadsheet values

for (;columnIndex < headerRow[0].length; columnIndex++) {

  copyBody.replaceText('%' + headerRow[0][columnIndex] + '%', 
                     activeRow[0][columnIndex]);                         
 }

// Create the PDF file and delete the doc copy

 copyDoc.saveAndClose();

 pdfFile = DriveApp.createFile(copyFile.getAs("application/pdf"));

 pdfFile2 = pdfFile.setName(fileName)

 copyFile.setTrashed(true);

 return pdfFile2;

                  }}

提示:请注意正确格式化代码,因为它将帮助您理解其结构。以下是您通过后所拥有的内容:

风险值模板ID='1Mxrm0kny8R7ROlBou8kSUc8dOvvH8PvtQ-EC_Nd3FUQ'; 功能开放{ 电子表格应用程序 格蒂先生 .createMenu“创建PDF” .addItem“创建PDF”、“创建PDF” .addToUi; } 对于var i=2;i<3;i++{ 函数createPdf{ 如果模板ID=={ SpreadsheetApp.getUi.alert“模板ID需要在code.gs中定义”; 回来 } //设置文档和电子表格访问权限 var copyFile=DriveApp.getFileByIdTEMPLATE\u ID.makeCopy, copyId=copyFile.getId, copyDoc=DocumentApp.openByIdcopyId, copyBody=copyDoc.getBody, activeSheet=SpreadsheetApp.getActiveSheet, numberOfColumns=activeSheet.getLastColumn, activeRow=activeSheet.getRangei,1,1,numberOfColumns.getValues, headerRow=activeSheet.getRange1,1,1,numberOfColumns.getValues, columnIndex=0, fileName=activeRow[0][0]+activeRow[0][1], Pdfile, pdfFile2; //用电子表格值替换键 对于;columnIndex i上的for循环在全局范围内,不是任何函数的一部分。因此,它将在每次调用脚本中的任何函数时执行,但不会像在函数中那样显式地被调用

函数createPDF在for循环中声明。这在全局范围内,请参见第1点,因此它仍然可以从其他功能(如onOpen创建的菜单)调用。但是,因为它只是一个声明,所以i循环不会调用它!这是你问题的主要关注点

createPdf中有一个返回调用,它可能是生成单个PDF的代码的原始副本的剩余部分。因为它是第一次通过循环返回的,所以它仍然会生成一个PDF。该行需要移动或删除

返回pdfFile2; 翻开那几行,删除报税表,我们就可以解决问题了

风险值模板ID='1Mxrm0kny8R7ROlBou8kSUc8dOvvH8PvtQ-EC_Nd3FUQ'; 功能开放{ 电子表格应用程序 格蒂先生 .createMenu“创建PDF” .addItem“创建PDF”、“创建PDF” .addToUi; } 函数createPdf{ 对于变量i=2;i<3;i++{ 如果模板ID=={ SpreadsheetApp.getUi.alert“模板ID需要在code.gs中定义”; 回来 } //设置文档和电子表格访问权限 var copyFile=DriveApp.getFileByIdTEMPLATE\u ID.makeCopy, copyId=copyFile.getId, copyDoc=DocumentApp.openByIdcopyId, copyBody=copyDoc.getBody, activeSheet=SpreadsheetApp.getActiveSheet, numberOfColumns=activeSheet.getLastColumn, activeRow=activeSheet.getRangei,1,1,numberOfColumns.getValues, headerRow=activeSheet.getRange1,1,1,numberOfColumns.getValues, columnIndex=0, fileName=activeRow[0][0]+activeRow[0][1], Pdfile, pdfFile2; //用电子表格值替换键 对于;columnIndex太糟糕了,这是错误的标签,这使它不被看到的人,可以帮助。事实上,它几乎是隐形的,4个月内只有10个视图。