延续我之前的question,我想把Google Sheet的两个标签合并成一个pdf.@Tanaike提出了一个解决方案,根据需要在这个sheet上发挥了作用.以下是建议的javascript library代码:

function myFunction(e) {

   var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Form responses 1");
   SpreadsheetApp.flush();

   const output = [
    {sheetName: "Quan", range: "A2:Q28"},
    {sheetName: "Qual", range: "A1:I27"},
    ];

    var ss = SpreadsheetApp.getActiveSpreadsheet();
    const url_base = ss.getUrl().replace(/edit$/,'');
    const headers = {authorization: "Bearer " + ScriptApp.getOAuthToken()};
    const data = output.map(({sheetName, range}) => {
    const s = ss.getSheetByName(sheetName);
    const gid = s.getSheetId();
    const r = s.getRange(range);
    const r1 = r.getRow() - 1;
    const c1 = r.getColumn() - 1;
    const r2 = r1 + r.getNumRows();
    const c2 = c1 + r.getNumColumns();
    const url = `${url_base}export?exportFormat=pdf&format=pdf`
      + '&size=letter'
      + '&portrait=true'
      + '&fitw=true'
      + '&sheetnames=false&printtitle=false&pagenumbers=false'
      + '&gridlines=false'
      + '&fzr=false'
      + `&gid=${gid}&r1=${r1}&c1=${c1}&r2=${r2}&c2=${c2}`;
    const res = UrlFetchApp.fetch(url, {headers, muteHttpExceptions: true});
   
    if (res.getResponseCode() != 200) {
      console.log(res.getContentText())
      }
    return new Uint8Array(res.getContent());
     });
 
     const setTimeout = function(f, t) {
     Utilities.sleep(t);
     return f(); }
     const pdfDoc = await PDFLib.PDFDocument.create();
 
    for (let i = 0; i < data.length; i++) {
    const pdfData = await PDFLib.PDFDocument.load(data[i]);
    const pages = await pdfDoc.copyPages(pdfData, [...Array(pdfData.getPageCount())].map((_, i) => i));
    pages.forEach(page => pdfDoc.addPage(page));
    }
    const bytes = await pdfDoc.save();
    var folder = DriveApp.getFolderById('1t6ns346GNX_gP-uGkwE43egGhTCaWgKO');
    var pdf = folder.createFile(Utilities.newBlob([...new Int8Array(bytes)], MimeType.PDF, "sample1.pdf"));

    console.log(pdf.getUrl())
    sheet.getRange("AW7").setValue(pdf.getUrl());

}

问题是这个脚本只适用于这Spreadsheet.如果我复制它或使用url访问另一个Spreadsheet,则它会显示以下错误消息:

ReferenceError:未定义setTimeout(匿名)@JS Library.gs:15 X@JS Library.gs:15(匿名)@JS Library.gs:15 (匿名)@JS Library.gs:15(匿名)@JS Library.gs:15 a@js Library.gs:15

在代码的第6行,语句是SpreadsheetApp.getActiveSpreadsheet(),我想使用SpreadsheetApp.openByUrl().任何指导意见都将不胜感激.

推荐答案

虽然我不确定这是否是您当前问题的直接解决方案,但下面的修改如何?

出发地:

function myFunction(e) {

致:

const setTimeout = function (f, t) {
  Utilities.sleep(t);
  return f();
}

async function myFunction(e) {
  • 请加async.
  • 在此修改中,setTimeout被移动为全局.

Javascript相关问答推荐

在卡信息之间切换

使用CDO时如何将Vue组件存储在html之外?

用户单击仅在JavaScript中传递一次以及其他行为

如何修复循环HTML元素附加函数中的问题?

窗口.getComputedStyle()在MutationObserver中不起作用

深嵌套的ng-container元素仍然可以在Angular 布局组件中正确渲染内容吗?

如何在RTK上设置轮询,每24小时

Redux查询多个数据库Api reducerPath&

Snowflake JavaScript存储过程返回成功,尽管预期失败

为什么我的列表直到下一次提交才更新值/onChange

将自定义排序应用于角形数字数组

TypeScript索引签名模板限制

无法访问Vue 3深度监视器中对象数组的特定对象值'

类构造函数不能在没有用With Router包装的情况下调用

当我try 将值更改为True时,按钮不会锁定

如何在一个对象Java脚本中获取不同键的重复值?

有没有办法通过使用不同数组中的值进行排序

如何使用Reaction路由导航测试挂钩?

无法使用Redux异步函数读取未定义的useEffect钩子的属性';map';

KeyboardEvent:检测到键具有打印的表示形式