使用 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。请注意这一点。
这是实现问题目标的简单示例脚本。所以请根据自己的实际情况进行修改。
参考:
我正在尝试将 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。请注意这一点。
这是实现问题目标的简单示例脚本。所以请根据自己的实际情况进行修改。