Google 模拟文件的应用程序脚本 - 使用自定义菜单项将 csv 文件导入 sheet
Google App Script to imitate File - Import csv file into a sheet using a custom menu item
如何编写一个脚本,让我可以 select 并在单击自定义菜单时从本地驱动器上传 CSV 文件到 Google 电子表格中? (我想通过脚本复制文件 --> 导入命令,但在打开时呈现的新菜单中)。
这里有一个类似的问题,但答案使用了一种现已弃用的方法。
Script import local CSV in Google Spreadsheet
已弃用的答案
function doGet(e) {
var app = UiApp.createApplication().setTitle("Upload CSV to Sheet");
var formContent = app.createVerticalPanel();
formContent.add(app.createFileUpload().setName('thefile'));
formContent.add(app.createSubmitButton('Start Upload'));
var form = app.createFormPanel();
form.add(formContent);
app.add(form);
// return app;
SpreadsheetApp.getActiveSpreadsheet().show(app);// show app
}
function doPost(e) {
// data returned is a blob for FileUpload widget
var fileBlob = e.parameter.thefile;
// parse the data to fill values, a two dimensional array of rows
// Assuming newlines separate rows and commas separate columns, then:
var values = []
var rows = fileBlob.contents.split('\n');
for(var r=0, max_r=rows.length; r<max_r; ++r)
values.push( rows[r].split(',') ); // rows must have the same number of columns
// Using active sheet here, but you can pull up a sheet in several other ways as well
SpreadsheetApp.getActiveSheet()
.getRange( 1, 1, values.length, values[0].length )
.setValues(values);
}
与其从本地上传,不如从 Google 云端硬盘上传更简单。
Check-out 下面的代码:
function importCSVFromGoogleDrive() {
var file = DriveApp.getFilesByName("file.csv").next();
var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('TEST').activate();
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
}
这会将数据从 Google 驱动器中的“file.csv”复制到电子表格中名为“TEST”的 Sheet。
我相信你的目标如下。
- 您想通过从 Google Spreadsheet.
的自定义菜单执行脚本,将 CSV 数据上传到活动 sheet
在这种情况下,下面的示例脚本怎么样?
示例脚本:
Google Apps 脚本端:Code.gs
请将以下脚本作为脚本复制并粘贴到脚本编辑器中。
function onOpen() {
SpreadsheetApp.getUi().createMenu("sample").addItem("import CSV", "importCsv").addToUi();
}
function importCsv(e){
if (!e) {
SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutputFromFile("index"), "sample");
return;
}
const csv = Utilities.parseCsv(Utilities.newBlob(...e).getDataAsString());
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(sheet.getLastRow() + 1, 1, csv.length, csv[0].length).setValues(csv);
}
HTML 和 Javascript 方:index.html
请将以下脚本复制并粘贴到脚本编辑器中作为 HTML。
<form><input type="file" name="file" onchange="importCsv(this.parentNode)" accept=".csv,text/csv"></form>
<script>
function importCsv(e) {
const file = e.file.files[0];
const f = new FileReader();
f.onload = d => google.script.run.withSuccessHandler(google.script.host.close).importCsv([[...new Int8Array(d.target.result)], file.type, file.name]);
f.readAsArrayBuffer(file);
}
</script>
测试:
当您测试上述脚本时,请运行onOpen
或重新打开Spreadsheet。这样,您就可以看到自定义菜单。当您从自定义菜单 select“导入 CSV”时,会打开一个对话框。当您 select 来自本地 PC 的 CSV 文件时,CSV 数据将导入活动 sheet。
注:
- 这是一个简单的示例脚本。所以请根据您的实际情况进行修改。
参考文献:
如何编写一个脚本,让我可以 select 并在单击自定义菜单时从本地驱动器上传 CSV 文件到 Google 电子表格中? (我想通过脚本复制文件 --> 导入命令,但在打开时呈现的新菜单中)。
这里有一个类似的问题,但答案使用了一种现已弃用的方法。 Script import local CSV in Google Spreadsheet
已弃用的答案
function doGet(e) {
var app = UiApp.createApplication().setTitle("Upload CSV to Sheet");
var formContent = app.createVerticalPanel();
formContent.add(app.createFileUpload().setName('thefile'));
formContent.add(app.createSubmitButton('Start Upload'));
var form = app.createFormPanel();
form.add(formContent);
app.add(form);
// return app;
SpreadsheetApp.getActiveSpreadsheet().show(app);// show app
}
function doPost(e) {
// data returned is a blob for FileUpload widget
var fileBlob = e.parameter.thefile;
// parse the data to fill values, a two dimensional array of rows
// Assuming newlines separate rows and commas separate columns, then:
var values = []
var rows = fileBlob.contents.split('\n');
for(var r=0, max_r=rows.length; r<max_r; ++r)
values.push( rows[r].split(',') ); // rows must have the same number of columns
// Using active sheet here, but you can pull up a sheet in several other ways as well
SpreadsheetApp.getActiveSheet()
.getRange( 1, 1, values.length, values[0].length )
.setValues(values);
}
与其从本地上传,不如从 Google 云端硬盘上传更简单。
Check-out 下面的代码:
function importCSVFromGoogleDrive() {
var file = DriveApp.getFilesByName("file.csv").next();
var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('TEST').activate();
sheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
}
这会将数据从 Google 驱动器中的“file.csv”复制到电子表格中名为“TEST”的 Sheet。
我相信你的目标如下。
- 您想通过从 Google Spreadsheet. 的自定义菜单执行脚本,将 CSV 数据上传到活动 sheet
在这种情况下,下面的示例脚本怎么样?
示例脚本:
Google Apps 脚本端:Code.gs
请将以下脚本作为脚本复制并粘贴到脚本编辑器中。
function onOpen() {
SpreadsheetApp.getUi().createMenu("sample").addItem("import CSV", "importCsv").addToUi();
}
function importCsv(e){
if (!e) {
SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutputFromFile("index"), "sample");
return;
}
const csv = Utilities.parseCsv(Utilities.newBlob(...e).getDataAsString());
const sheet = SpreadsheetApp.getActiveSheet();
sheet.getRange(sheet.getLastRow() + 1, 1, csv.length, csv[0].length).setValues(csv);
}
HTML 和 Javascript 方:index.html
请将以下脚本复制并粘贴到脚本编辑器中作为 HTML。
<form><input type="file" name="file" onchange="importCsv(this.parentNode)" accept=".csv,text/csv"></form>
<script>
function importCsv(e) {
const file = e.file.files[0];
const f = new FileReader();
f.onload = d => google.script.run.withSuccessHandler(google.script.host.close).importCsv([[...new Int8Array(d.target.result)], file.type, file.name]);
f.readAsArrayBuffer(file);
}
</script>
测试:
当您测试上述脚本时,请运行onOpen
或重新打开Spreadsheet。这样,您就可以看到自定义菜单。当您从自定义菜单 select“导入 CSV”时,会打开一个对话框。当您 select 来自本地 PC 的 CSV 文件时,CSV 数据将导入活动 sheet。
注:
- 这是一个简单的示例脚本。所以请根据您的实际情况进行修改。