【问题标题】:Upload PDF file in Google sheet using Google apps script使用 Google Apps 脚本在 Google 表格中上传 PDF 文件
【发布时间】:2022-01-26 00:50:16
【问题描述】:

我正在尝试将 pdf 文件上传到谷歌表格中的单个单元格,就像我们在谷歌表格单元格中插入图像一样。我已经搜索了很长时间,但一直找不到任何解决方案。我试过以下代码:

function onOpen(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var menuEntries = [];
  menuEntries.push({name: "File...", functionName: "doGet"});
  ss.addMenu("Attach ...", menuEntries);
}

function doGet(e) {
  var app = UiApp.createApplication().setTitle("upload attachment into Google Drive");
  SpreadsheetApp.getActiveSpreadsheet().show(app);
  var form = app.createFormPanel().setId('frm').setEncoding('multipart/form-data');
  var formContent = app.createVerticalPanel();
  form.add(formContent);  
  formContent.add(app.createFileUpload().setName('thefile'));

  formContent.add(app.createHidden("activeCell", SpreadsheetApp.getActiveRange().getA1Notation()));
  formContent.add(app.createHidden("activeSheet", SpreadsheetApp.getActiveSheet().getName()));
  formContent.add(app.createHidden("activeSpreadsheet", SpreadsheetApp.getActiveSpreadsheet().getId()));
  formContent.add(app.createSubmitButton('Submit'));
  app.add(form);
  SpreadsheetApp.getActiveSpreadsheet().show(app);
  return app;
}

function doPost(e) {
  var app = UiApp.getActiveApplication();
  app.createLabel('saving...');
  var fileBlob = e.parameter.thefile;
  var doc = DriveApp.getFolderById('0B0uw1JCogWHuc29FWFJMWmc3Z1k').createFile(fileBlob);
  var label = app.createLabel('file uploaded successfully');


  var value = 'hyperlink("' + doc.getUrl() + '";"' + doc.getName() + '")'
  var activeSpreadsheet = e.parameter.activeSpreadsheet;
  var activeSheet = e.parameter.activeSheet;
  var activeCell = e.parameter.activeCell;
  var label = app.createLabel('file uploaded successfully');
  app.add(label);
  SpreadsheetApp.openById(activeSpreadsheet).getSheetByName(activeSheet).getRange(activeCell).setFormula(value);
  app.close();
  return app;
}

由于 UiApp 已被弃用,因此它显示错误“UiApp 已被弃用。请改用 HtmlService”。我尝试了以下行来避免 UiApp 错误但没有用:

var app = HtmlService.createHtmlOutput();

是否有任何解决方法可以避免此错误?谢谢。

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,我无法想象I am trying to upload pdf file to a single cell in google sheet just like we insert image in a google sheet cell.。不幸的是,在当前阶段,无法将 PDF 文件插入到单元格中。那么,我可以问你关于你的目标的细节吗?而且,如果PDF数据有多个页面,你想怎么做?
  • @Tanaike 谢谢。是的,如果我们可以将 pdf 文件插入到 google sheet 中,它将被上传到指定的文件夹中。上面的代码做到了,但由于 UiApp 不再可用,所以我正在寻找解决方法。
  • 感谢您的回复。我不得不再次为我糟糕的英语水平道歉。不幸的是,我无法理解if we can insert a pdf file into google sheet and it will be uploaded into a specified folder.。不幸的是,在当前阶段,无法将 PDF 文件插入到单元格中。那么,我可以问你关于你的目标的细节吗?而且,如果PDF数据有多个页面,你想怎么做?
  • 假设有一个插件,我们使用它上传文件。 pdf的一般图像将插入指定的单元格,但该pdf文件将发送到指定的google驱动器文件夹。现在,我不确定 pdf 页面的复杂性。
  • 感谢您的回复。我了解到您想将本地 PC 上的 PDF 文件上传到 Google Drive。你想把确认消息放到一个单元格中。您想使用 HTML 和 Google Apps 脚本来实现这一点。我的理解正确吗?如果我的理解是正确的,请问您要将消息发送到哪个单元格?

标签: javascript pdf google-apps-script google-sheets file-upload


【解决方案1】:

我相信你的目标如下。

  • 来自您的以下 cmets,

    我在本地电脑中有 pdf 文件,我会有一个带有“文件上传”选项的 google sheet 插件。我会点击它,它会将文件上传到我们在脚本中指定的 Drive 文件夹中,并且活动的 google sheet 单元格将显示确认消息。

    我想将消息放在工作表的当前活动单元格中

  • 您想将本地 PC 上的 PDF 文件上传到 Google Drive。并且您想将确认消息放到当前活动的单元格中。您想通过使用 HTML 和 Google Apps 脚本的侧边栏来实现这一点。

在这种情况下,下面的示例脚本怎么样?

示例脚本:

Google Apps 脚本端:Code.gs

请将以下脚本作为脚本文件复制并粘贴到 Google 电子表格的脚本编辑器中并保存。

const openSidebar = _ => SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutputFromFile("index"));

function upload(e){
  const message = "sample confirmation message"; // Please set your confirmation message.

  DriveApp.createFile(Utilities.newBlob(...e));
  SpreadsheetApp.getActiveRange().setValue(message);
}

HTML&Javascript 端:index.html

请将以下脚本作为 HTML 文件复制并粘贴到 Google 电子表格的脚本编辑器中并保存。

<form>
  <input type="file" name="file" onchange="upload(this.parentNode)" accept=".pdf,application/pdf" />
</form>
<script>
function upload(e){
  const file = e.file.files[0];
  const fr = new FileReader();
  fr.onload = e => google.script.run.upload([[...new Int8Array(e.target.result)], file.type, file.name]);
  fr.readAsArrayBuffer(file);
}
</script>

测试:

当您运行函数openSidebar 时,侧边栏会打开。并且当您从输入标签中选择文件时,该文件将上传到 Google Drive 的根文件夹,并将确认消息放入活动单元格。

注意:

  • 在此方法中,由于 Google Apps 脚本端的规范,最大文件大小为 50 MB。请注意这一点。

  • 这是一个用于实现您的问题目标的简单示例脚本。所以请根据您的实际情况进行修改。

参考:

【讨论】:

  • 谢谢。有用。 pdf 将进入 Drive 的根文件夹。我们可以指定文件夹而不是根目录吗?
  • @Roomi 感谢您的回复。我很高兴你的问题得到了解决。关于你的附加问题,是的。在这种情况下,请将DriveApp.createFile(Utilities.newBlob(...e)) 修改为DriveApp.getFolderById("###folderId###").createFile(Utilities.newBlob(...e))。这样,上传的 PDF 文件就会创建到特定的文件夹中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
相关资源
最近更新 更多