当前位置: 首页 > 知识库问答 >
问题:

脚本清除数据太早,有人知道原因吗?

程城
2023-03-14

所以我在谷歌工作表上做一个项目,使用脚本,最终将完成以下工作:;

首先,根据单元格中的名称,在表单响应中查找该人员的最后9个条目。

然后它安排数据的方式我需要并写入到一个表内我的电子表格

脚本的最后一部分(不是我自己的作品,而是我在这里找到的东西)我在网上找到的脚本,我试图适应我的需求,但还没有。创建一个PDF,保存在谷歌驱动器,然后通过电子邮件发送。

这部分需要更多的工作,因为我想指定使用名称和日期的PDF被称为什么。我还想说明它保存在谷歌的什么地方。最后,脚本只生成一个PDF。想最终复制脚本,所以我可以创建1 PDF或批量创建它们。如果我被卡住了,以后可能会发布这些。

总之,这就是概述。

目前,该脚本可以工作,可以查询我想要的数据,将其写入工作表,以PDF格式保存到驱动器,并通过电子邮件发送到一个硬编码的电子邮件地址。令人敬畏。

但随后我尝试添加一个名为clearRanges的函数,该函数将在写入数据之前清除模板表。我使用名称范围来定义要清除的3个部分。但是自从引入它以来,我在我的剧本的各个部分都尝试过它。我的驱动器和电子邮件中都有空白的PDF。

这就像在清除数据之前不等待创建PDF或发送电子邮件一样。我也试着把它放在我剧本的开头,但都是一样的。我不知道为什么。

我在玩锁和等待锁作为一个可能的解决方案,但它似乎没有帮助。

如果有人能帮忙,我将不胜感激。

  function getAgentName() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      Browser.msgBox("Please go to the sheet called PDF Creator, in cell A2, choose the agent you wish to create a PDF for");
      var sheet = ss.getSheetByName("PDF Creator");
      var range = sheet.getRange("A2")
      var value = range.getValue();

      if (value == 0) {
          Browser.msgBox("You need to go to the sheet named PDF Creator and put an agent name in cell A2");
      } else {
          getAgentData(value);
      }
  }

  function getAgentData(value) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sourceSheet = ss.getSheetByName("Form responses 1")
      var sourceRange = sourceSheet.getDataRange();
      var sourceValues = sourceRange.getValues();
      var agentData = [];
      var commentsData = [];

      for (i = 0; i < sourceValues.length; i++) {
          // Defines the data layout for PDF.
          var agentName = sourceValues[i][2];
          var dateTime = sourceValues[i][3];
          var callType = sourceValues[i][7];
          var opening = sourceValues[i][8];
          var rootCause = sourceValues[i][9];
          var rootFix = sourceValues[i][10];
          var process = sourceValues[i][11];
          var consumer = sourceValues[i][12];
          var control = sourceValues[i][13];
          var wrapup = sourceValues[i][14];
          var dpa = sourceValues[i][15];
          var score = sourceValues[i][22];
          var comments = sourceValues[i][16];
          var agentRow = [dateTime, callType, opening, rootCause, rootFix, process, consumer, control, wrapup, dpa, score];
          var commentsRow = [dateTime, comments];

          if (agentName == value && agentData.length < 9) {
              agentData.push(agentRow)
              commentsData.push(commentsRow)
          }
      }

      agentData.sort(function (a, b) {
          return b[0] - a[0]
      });

      commentsData.sort(function (a, b) {
          return b[0] - a[0]
      });

      var destSheet = ss.getSheetByName("AgentPDF");
      destSheet.getRange("A1").setValue(value + "'s Quality Score card");
      var range = destSheet.getRange(6, 1, agentData.length, agentData[0].length);
      range.setValues(agentData);
      var commentRange = destSheet.getRange(18, 1, commentsData.length, commentsData[0].length);
      commentRange.setValues(commentsData);
      emailSpreadsheetAsPDF();
  }

  /* Send Spreadsheet in an email as PDF, automatically */
  function emailSpreadsheetAsPDF() {
      // Send the PDF of the spreadsheet to this email address
      var email = "firstname.lastname@domain.co.uk";
      // Subject of email message
      // The date time string can be formatted in your timezone using Utilities.formatDate method
      var subject = "PDF Reports - " + (new Date()).toString();
      // Get the currently active spreadsheet URL (link)
      // Or use SpreadsheetApp.openByUrl("<<SPREADSHEET URL>>");
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      // Email Body can  be HTML too with your logo image - see ctrlq.org/html-mail
      var body = "PDF generated using code at ctrlq.org from sheet " + ss.getName();
      var url = ss.getUrl();
      url = url.replace(/edit$/, '');
      /* Specify PDF export parameters
  // From: https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579
    exportFormat = pdf / csv / xls / xlsx
    gridlines = true / false
    printtitle = true (1) / false (0)
    size = legal / letter/ A4
    fzr (repeat frozen rows) = true / false
    portrait = true (1) / false (0)
    fitw (fit to page width) = true (1) / false (0)
    add gid if to export a particular sheet - 0, 1, 2,..
  */
      var url_ext = 'export?exportFormat=pdf&format=pdf' // export as pdf
      + '&size=a4' // paper size
      + '&portrait=1' // orientation, false for landscape
      + '&fitw=true&source=labnol' // fit to width, false for actual size
      + '&sheetnames=false&printtitle=false' // hide optional headers and footers
      + '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
      + '&fzr=false' // do not repeat row headers (frozen rows) on each page
      + '&gid=928916939'; // the sheet's Id
      var token = ScriptApp.getOAuthToken();
      //  var sheets = ss.getSheets(); 
      //make an empty array to hold your fetched blobs  
      var blobs = [];
      //  for (var i=0; i<sheets.length; i++) {
      // Convert individual worksheets to PDF
      //    var response = UrlFetchApp.fetch(url + url_ext + sheets[i].getSheetId(), {
      var response = UrlFetchApp.fetch(url + url_ext, {
          headers: {
              'Authorization': 'Bearer ' + token
          }
      });

      //convert the response to a blob and store in our array
      blobs[0] = response.getBlob().setName("Tester " + '.pdf');
      //  }
      //create new blob that is a zip file containing our blob array
      //  var zipBlob = Utilities.zip(blobs).setName(ss.getName() + '.zip'); 
      var test = DriveApp.createFile(blobs[0]);
      //optional: save the file to the root folder of Google Drive
      DriveApp.createFile(test);
      // Define the scope
      Logger.log("Storage Space used: " + DriveApp.getStorageUsed());

      // If allowed to send emails, send the email with the PDF attachment
      if (MailApp.getRemainingDailyQuota() > 0)
          var lock = LockService.getScriptLock();
      GmailApp.sendEmail(email, subject, body, {
          attachments: [test]
      });

      lock.waitLock(20000);
      lock.releaseLock();
      clearRanges();
  }

  function clearRanges() {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      ss.getRangeByName('Header').clearContent();
      ss.getRangeByName('Scores').clearContent();
      ss.getRangeByName('Comments').clearContent();
  }

共有1个答案

漆雕恺
2023-03-14

您可以尝试添加电子表格应用程序吗。冲洗() emailSpreadsheetAsPDF()之前,在第60行附近进行编码>操作

电子表格pp.flush

commentRange.setValues(commentsData);
SpreadsheetApp.flush();
emailSpreadsheetAsPDF();

我以前也遇到过类似的问题,这很有效。

 类似资料:
  • 清除地球上添加的数据,同时有将数据线和数据点清除的效果。 // 使用 clearData API 来清除数据 controller.clearData();

  • 问题内容: 既然iText已经成为AGPL了,我假设有人将采用旧的(2.1.7或4.2.0)代码并对其进行分叉以保持LGPL版本继续运行。有人知道这样的叉子已经开始了吗? 问题答案: 我在博客中讨论了有关iText AGPL许可证的一些实际问题(该链接从我的SO配置文件链接)。为什么不只购买IText?尽管确实需要根据竞争标准定价,但在许多商业PDF库中,这当然是一个选择。 事实是,我过去从未真正

  • 我有一个badtokenexception的报告,尽管我尝试了任何事情,但我无法复制它,对我来说也不清楚它是如何发生的。 BadTokenException(@Android.view.viewrootimpl:setView:575)通过(@Android.view.WindowmanagerGlobal:AddView:272)完整跟踪:Android.view.Windowmanager$B

  • 存储库数据库存储监控过程中由 Navicat Monitor 收集的所有数据。它可能会消耗大量的硬盘空间。为防止数据库增长过大或使用所有硬盘空间,你可以设置定期自动数据清除。若配置数据清除设置,请前往“配置”->“数据清除”。 数据存储在两个类别中:警报和性能数据。警报数据显示在概览、警报历史记录和警报详细信息页面的各个部分。性能数据显示在概览、实例详细信息和图表页面。 你可以选择在每个类别中保留

  • 咱们正常传multi-part form-data,都是这种格式的 Documents[0][documentTitle],不过我们公司后端做的这个API,接受的是格式是中间多了一个点,也就变成了 Documents[0].documentTitle, 我正常发的json对象,后端说接收不到。让我改成他的这种格式,我不太知道怎么改,希望大佬能够指点,怎么想才能生成出这种带着dot(.)的格式阿?

  • 问题内容: 我有一个在1G RAM主机中运行的Docker容器(也有在同一主机中运行的其他容器)。该Docker容器中的应用程序将解码一些图像,这可能会消耗大量内存。 该容器会不时退出。我怀疑这是由于内存不足,但不是很确定。我需要找到根本原因的方法。那么,有什么办法知道这个集装箱的死亡发生了什么? 问题答案: 其他人提到查看应用程序的输出。这永远是我要检查的第一件事。 接下来,您可以运行查看状态的