所以我在谷歌工作表上做一个项目,使用脚本,最终将完成以下工作:;
首先,根据单元格中的名称,在表单响应中查找该人员的最后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();
}
您可以尝试添加电子表格应用程序吗。冲洗()
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容器中的应用程序将解码一些图像,这可能会消耗大量内存。 该容器会不时退出。我怀疑这是由于内存不足,但不是很确定。我需要找到根本原因的方法。那么,有什么办法知道这个集装箱的死亡发生了什么? 问题答案: 其他人提到查看应用程序的输出。这永远是我要检查的第一件事。 接下来,您可以运行查看状态的