从Google应用程序脚本doGet(e)返回两个值

2024-04-20 11:15:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在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'

如何成功返回列表和文档?我知道我错过了一些简单的事情


Tags: idurlforpdfvardocumentnumlet
1条回答
网友
1楼 · 发布于 2024-04-20 11:15:40

第一部分。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应为bytesstr,但得到了int。您可以使用json方法或Responsetext属性直接处理JSON数据,具体实现取决于您


第二部分。谷歌应用程序脚本

即使您修复了客户端,您的Web应用程序仍然存在问题。首先,不能从JavaScript中的函数return multiple values。尽管如前所述,comma operator的行为可能会诱使你认为这是允许的。问题是只返回最后一个参数,以证明:

&13; 第13部分,;
const test = () => {
    const u = 1, l = 2;
    return u, l;
};

console.log(test());
和#13;
和#13;

其次,您应该从doGetdoPost触发器函数返回一个^{}^{}以获得正确的响应(您的响应是意外正确的)

相关问题 更多 >