谷歌应用脚​​本没有循环

Posted

技术标签:

【中文标题】谷歌应用脚​​本没有循环【英文标题】:Google apps script not looping 【发布时间】:2018-08-30 16:09:58 【问题描述】:

我是一名教师(这意味着我真的不知道自己在做什么),他正在努力为我们的员工更快地制作日常文档。我创建了一个谷歌表,它将单元格行中的信息嵌入到谷歌文档中。我想找到一种方法,当我运行脚本时,它会为每一行运行它并将所有内容收集到 pdf 中,这样我就可以一次打印来自多个学生的数据。这是我正在运行此脚本的link to my google sheets 文档。

关于如何完成这项工作的任何想法?我目前拥有的脚本适用于第一行,但不会继续适用于任何其他行。

 var data = sheet.getRange(4,1,sheet.getLastRow(),
 sheet.getLastColumn()).getValues();
//var data = sheet.getRange(4,1,1,sheet.getLastColumn()).getValues();


var i;
  for (i = 0; i < data.length ; i++) 
    var row = data[i++];

  // setting up the temporary document
    var docid = DriveApp.getFileById(templateid).makeCopy().getId();
    var doc = DocumentApp.openById(docid);
    var body = doc.getBody();

 // I have removed the parts that gather data and the replace text.


    ss.toast("Creating your ALE document");
    Utilities.sleep(sleepINT);


  var file = DriveApp.getFileById(doc.getId());
  var newfolder = DriveApp.getFolderById("1oQ8evDj8dlHoDdX01DvZqjcIkSq31oen");
  var oldfolder = DriveApp.getFolderById("1IzY9PiobBC-O87AxCkU32j2n2wUU1zUE");
  newfolder.addFile(file);
  oldfolder.removeFile(file);

  ss.toast("PDF has been created!");
  Utilities.sleep(sleepINT);

  var usernamefordoctitle = sheet.getRange(4,1,1,1).getValues()
  var name = doc.getName();
  doc.setName(month + " ALE for " + studentName);
  ss.toast("Document has been named");
  Utilities.sleep(sleepINT);

  doc.saveAndClose();
  var pdffolder = DriveApp.getFolderById ("1iwBEUZpFwz_eaCVKemYozF5FA0_t0YGv");
  var pdfFILE = DriveApp.getFileById(doc.getId()).getAs('application/pdf');
  pdfFILE.setName(doc.getName() + ".pdf");
  var theFile = DriveApp.createFile(pdfFILE);
  pdffolder.addFile(theFile);
  ss.toast("Document has been saved to Google Drive");
  Utilities.sleep(sleepINT);

  var pdfEMAIL = DriveApp.getFileById(doc.getId()).getAs('application/pdf').getBytes();
  var message = "This is your" + month + "ALE documents for your AG student."
  var emailTo = emailAddress;
  var subject = "Your " + month + " ALE for " + studentName + " ????";
  var message = "The attached pdf document is your " + month + " monthly ALE document for " + studentName + ".";

  MailApp.sendEmail(emailTo, subject, message, attachments: pdfFILE);
  ss.toast("Email has been sent");
  
  Utilities.sleep(sleepINT);
  ss.toast("???? FINISHED!!!! ????");

【问题讨论】:

我已将行数减少到只有循环的行数。如前所述,它只运行一次脚本,并且不会重复脚本中的任何其他行。 我添加了应该循环的整个函数,除了在嵌入谷歌文档时替换文本。 然后在执行后查看 Stackdriver 日志,并在您的问题中报告您的发现。另外,请注意,您将迭代器 i 加倍:var row = data[i++]for(var i = 0; i &lt; data.length; i++)。应该是var row = data[i]; 这里的'for' lop 似乎没有左大括号。 for (i = 0; i @Rubén 我认为它可能应该关闭,直到 OP 可以澄清发生了什么 【参考方案1】:

我对循环很基础,但它们不应该是这样的吗:

for (i = 0; i < data.length ; i++) <--- the curly brace here.

试试?

【讨论】:

多语句体需要大括号。如果您只有一个语句,它们是可选的。其他条件代码也是如此,例如ifs。例如。 if (a === b) c = d + e; @tehhowch 有点奇怪的是,OP 不想在“for”循环中包含多个语句,因为他的主要问题是,据我所知,在于“for”循环只执行一次。否则,循环的唯一目的是更新“行”变量。但话又说回来,代码有些混乱,所以也许我正在阅读其中的内容。 @AntonDementiev OP 应我的要求更改了他们问题中的代码(他们最初有一堵长墙,然后砍掉了一堆,然后又添加了一些)。在原始代码中,有一个左大括号 - 因此我认为 OP 的问题与此处显示的代码无关。根据问题标题/描述,我想我们都同意 OP 想要在 for-loop 主体中有几个语句。在 OP 可以通过 MCVE 澄清他们的问题以及确认它只执行一次的记录/调试信息之前,我已投票结束。【参考方案2】:

注意:关于此答案的以下引用代码是由 OP 在revision 3 上引入的。

var row = data[i++];之后的语句块不属于for循环,for循环只包含一条语句。

for (i = 0; i < data.length ; i++) 
    var row = data[i++];

虽然 javascript 非常灵活,但对于那些不了解任何特定 JavaScript 样式指南的人来说,使用与 https://developers.google.com/apps-script 中包含的示例相同的样式可能会有所帮助

    在同一行开始语句块

    示例 1:

    function myFuncion()
    
    
    

    示例 2:

    for(var i = 0;i < data.length; i++)
    
    
    

    使用行终止符;

【讨论】:

如果您查看问题中的原始代码,这不是问题。 @tehhowch 我可以理解,如果我的帖子是在批评另一个帖子,但这个答案是为了回答当前的问题修订。我的答案中提到的代码是由 OP 在revision 3 上介绍的。

以上是关于谷歌应用脚​​本没有循环的主要内容,如果未能解决你的问题,请参考以下文章

谷歌应用脚​​本超时 ~ 5 分钟?

谷歌应用脚​​本超时 ~ 5 分钟?

使用谷歌应用脚​​本更新数据验证规则时如何保留原始范围

丢失谷歌应用脚​​本项目

谷歌应用脚​​本:您无权调用提示

谷歌应用脚​​本:是不是可以在发送共享通知的同时限制文件的共享设置?