我正在尝试在Google Apps脚本上创建一个自定义pdf web应用程序,将值替换到我的模板Google文档中。我在numGenerator函数中生成数字,并希望返回这些数字,以便以后在python文件中使用
function numGenerator(digits){
let listOfNums = [];
const powerOfTen = Math.pow(10, digits);
//Addition
for (i=0; i<6; i++) {
let num = getRandomNumber(0, powerOfTen);
sendToList(num, listOfNums);
}
//Subtraction
for (i=6; i<14; i+=2) {
let num1 = getRandomNumber(0, powerOfTen);
let num2 = getRandomNumber(num1, powerOfTen);
sendToList(num2, listOfNums);
sendToList(num1, listOfNums);
}
//Multiplication
for (i=14; i<22; i+=2) {
let num1 = getRandomNumber(2, (powerOfTen/10));
let num2 = getRandomNumber(2, 20);
sendToList(num1, listOfNums);
sendToList(num2, listOfNums);
}
//Division
for (i=22; i<30; i+=2) {
let num2 = getRandomNumber(2, (powerOfTen/10));
let num1 = getRandomNumber(2, (num2/10));
sendToList(num1*num2, listOfNums);
sendToList(num2, listOfNums);
}
return listOfNums;
}
function createDocument(doc_id, digits) {
const listOfNums = numGenerator(digits)
var TEMPLATE_ID = '#########'; // Google Doc template
var documentId = DriveApp.getFileById(TEMPLATE_ID).makeCopy().getId();
drivedoc = DriveApp.getFileById(documentId);
drivedoc.setName("Mental Math Starter Exercise" + doc_id); // Copy created
doc = DocumentApp.openById(documentId);
var body = doc.getBody();
body.replaceText('<ID>', doc_id);
body.replaceText('<digits>', digits)
for (i=1; i<=30; i++){
body.replaceText('<num' + i + '>', listOfNums[i-1]) // Generated numbers inserted
}
drivedoc.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT);
return [listOfNums, "https://docs.google.com/document/d/" + documentId + "/export?format=pdf"]; // This might be a problem
}
function doGet(e) {
var invoice_id = e.parameter.invoice_id; // fetches parameters
var digits = e.parameter.digits // fetches parameters
var url = createDocument(invoice_id, digits); // url should be a list here
return (url[0], ContentService.createTextOutput(url[1])); //Should have returned the listOfNums and the document here
}
在我尝试从函数返回两个值之前,下面的Python代码运行良好,下载了自定义工作表
import requests
import random
from PyPDF2 import PdfFileMerger
import os
url = "https://script.google.com/macros/s/AKfycbyWXUQkpxyxDtj8lsOZtdaCBqRJUMZ1f9jXOFaTN82HtGIMIFc/exec?invoice_id={" \
"}&digits={}"
def createPDF(digits):
merger = PdfFileMerger()
for digit in digits:
id_num = random.randint(0, 10000)
print("processing ", id_num, digit)
docURL = requests.get(url.format(id_num, digit))
print("file generated")
document = requests.get(docURL.content)
print("file downloaded")
listOfNums = document.content[0]
with open("worksheet{}.pdf".format(id_num), "wb") as f:
f.write(document.content[1])
# merger.append(response.content)
merger.append("worksheet{}.pdf".format(id_num))
os.remove("worksheet{}.pdf".format(id_num))
merger.write("result.pdf")
merger.close()
print("Worksheet bundle downloaded")
但是,现在我正在尝试访问文档和列表,出现以下错误:
File "/Users/vkhanna/PycharmProjects/MachineLearning/pdfRequest.py", line 22, in createPDF
f.write(document.content[1])
TypeError: a bytes-like object is required, not 'int'
如何成功返回列表和文档?我知道我错过了一些简单的事情
第一部分。Python
您应该注意函数的公共契约,尤其是在使用多种语言开发时。让我们一步一步来看看为什么会发生错误
首先,响应对象有一个
content
属性,即"content of the response, in bytes",到目前为止还不错。接下来,write
方法接受"either to a string (in text mode) or a bytes object (in binary mode)"。最后,尝试从bytes
数据类型按索引读取值会导致int
(因为字节是整数)所有这些都会导致您得到的错误
write
应为bytes
或str
,但得到了int
。您可以使用json
方法或Response的text
属性直接处理JSON数据,具体实现取决于您第二部分。谷歌应用程序脚本
即使您修复了客户端,您的Web应用程序仍然存在问题。首先,不能从JavaScript中的函数return multiple values。尽管如前所述,comma operator的行为可能会诱使你认为这是允许的。问题是只返回最后一个参数,以证明:
其次,您应该从} 或^{} 以获得正确的响应(您的响应是意外正确的)
doGet
或doPost
触发器函数返回一个^{