首页 > 解决方案 > 在 Google Sheet 中创建 PDF 循环

问题描述

该功能只工作一次。它根本不循环。

通过将 for 循环参数更改为仅数字并更改行的位置来进行调整。

function PDFAbsensi() {
var sourceSpreadsheet = SpreadsheetApp.getActive();

// Get active sheet.
var sheets = sourceSpreadsheet.getSheets();
var sheetName = sourceSpreadsheet.getActiveSheet().getName();
var sourceSheet = sourceSpreadsheet.getSheetByName('PRINT ABSENSI');

// Set the output filename.
var idkelompok = sourceSheet.getRange(2,36).getValues();
var namakelompok = sourceSheet.getRange(2,2).getValues();
var nomorkelompok = sourceSheet.getRange(2,3).getValues();
var pdfName = idkelompok + " - " + namakelompok + " " + nomorkelompok;

// export url
var url = 'https://docs.google.com/spreadsheets/d/'+sourceSpreadsheet.getId()+'/export?exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
+ '&gid='+sourceSpreadsheet.getSheetByName('PRINT ABSENSI').getSheetId(); 

var token = ScriptApp.getOAuthToken(); 
var response = UrlFetchApp.fetch(url, {
headers: {
  'Authorization': 'Bearer ' +  token} });


var parents = DriveApp.getFileById(sourceSpreadsheet.getId()).getParents();
if (parents.hasNext()) {
var folder = parents.next();}
else {
folder = DriveApp.getRootFolder();}

// Loop
var jumlahpdf = sourceSheet.getRange(5,36).getValue();
for (i=0;i<jumlahpdf;i++) {

var theBlob = response.getBlob().setName(pdfName+'.pdf');

// delete pdf if already exists
var files = folder.getFilesByName(pdfName+'.pdf');
while (files.hasNext())

{files.next().setTrashed(true);}

// create pdf
var newFile = folder.createFile(theBlob);

return true;

// Delete the wasted sheet we created, so our Drive stays tidy.
DocsList.getFileById(newSpreadsheet.getId()).setTrashed(true);

// Add the number for looping function
var updatenomorkelompok = sourceSheet.getRange(2,36).setValue(idkelompok-(-1));}}

我希望代码能够创建多个 PDF 文件。截至目前,它每次运行时只制作一个。

标签: google-apps-scriptgoogle-sheets

解决方案


问题:

你在你的循环return true中间。for


解释:

在第return一个循环中完全结束函数。这是预期的行为,见下文MDNreturn文档

return 语句结束函数执行并指定要返回给函数调用者的值。


例子:

下面是一个基本for循环,它记录i每次运行的值:

for (i = 0; i < 3; i++) {
  console.log(i);
}

这会按预期记录每次迭代。

这是您正在使用的 return 语句的示例(相同的for循环,但在return true内部):

testReturn();

function testReturn() {
  for (i = 0; i < 3; i++) {
    console.log(i);
    return true;
  }
}

当调用这个函数时,我们得到一个 0 的日志条目(第一次运行),但是当我们正在return执行时,函数执行结束了,因此你的脚本只处理第一个 PDF。



推荐阅读