使用 Google 应用程序脚本在 Google sheet 中上传 PDF 文件

Upload PDF file in Google sheet using Google apps script

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

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 have pdf file in local pc, I would have a google sheet add-on with an option "file upload". I would click on that, it will upload file in the Drive folder which we have specified in script and the active google sheet cell will show the confirmation message.

    I want to put the message in currently active cell of the sheet

  • 您想将本地 PC 上的 PDF 文件上传到 Google 云端硬盘。并且您想将确认消息放入当前活动的单元格。您想使用 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

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

<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 时,边栏会打开。当您 select 输入标签中的文件时,文件会上传到 Google 驱动器的根文件夹,并且确认消息会放入活动单元格。

注:

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

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

参考: