如何解决将 txt 文件导入 Google Sheet 的脚本基于现有的 VBA
我有将一些文本文件导入 Excel 工作表的 VBA 代码,但现在我已经在 Google 表格中实现它来做同样的事情。有人可以帮我将 VBA 转换为 GAS 吗?
代码:
Sub ImportTXTFiles()
Dim fso As Object
Dim xlsheet As Worksheet
Dim qt As QueryTable
Dim LastRow As Long
Dim txtfilesToOpen As Variant,txtfile As Variant
Application.ScreenUpdating = False
Set fso = CreateObject("Scripting.FileSystemObject")
txtfilesToOpen = Application.GetopenFilename _
(FileFilter:="Text Files (*.txt),*.txt",_
MultiSelect:=True,Title:="Text Files to Open")
LastRow = 1
For Each txtfile In txtfilesToOpen
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & txtfile,_
Destination:=ActiveSheet.Cells(LastRow,1))
.TextFileParseType = xlDelimited
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileOtherDelimiter = " "
.Refresh BackgroundQuery:=False
End With
LastRow = LastRow + 1
For Each qt In ActiveSheet.QueryTables
qt.Delete
Next qt
Next txtfile
Application.ScreenUpdating = True
MsgBox "Successfully imported text files!",vbinformation,"SUCCESSFUL IMPORT"
Set fso = nothing
End Sub
解决方法
任务完成。首先,必须构建某种 UI 才能将 .txt 文件上传到 Google Drive。之后,可以将它们导入到工作表中(还有其他 2 个功能:删除驱动器上的文件和刷新)。 好的,代码:
.gs 代码:
function onOpen() {
openHTML();
showSidebar();
listFilesFromDrive(); }
function doGet() {
return HtmlService.createHtmlOutputFromFile('Index');
}
function listFilesFromDrive() {
var sh = SpreadsheetApp.getActiveSheet();
sh.getRange("A2:D").clear();
var folder = DriveApp.getFolderById('xxxxxxxxxxxxxxxxxxxxxxxx'); // I change the folder ID here
var list = [];
list.push(['Nazwa pliku log']); //,'ID','Size']);
var files = folder.getFiles();
while (files.hasNext()){
file = files.next();
var row = []
row.push(file.getName())
list.push(row);
}
sh.getRange(1,1,list.length,list[0].length).setValues(list);
importFilesContent();
}
function importFilesContent() {
var i = 2;
var sh = SpreadsheetApp.getActiveSheet();
var folder = DriveApp.getFolderById('xxxxxxxxxxxxxxxxxxxxxxxx'); // I change the folder ID here
var files = folder.getFiles();
while (files.hasNext()){
file = files.next();
var contents = file.getBlob().getDataAsString().trim();
var lines = contents.split(",");
contents = lines.map(function(lin){return lin.split(" ")});
sh.getRange(i,2,contents.length,contents[0].length).setValues(contents);
i = i + 1;
}
}
function saveFile(obj) {
var blob = Utilities.newBlob(Utilities.base64Decode(obj.data),obj.mimeType,obj.fileName);
var output = HtmlService.createHtmlOutput('<script>google.script.host.close();</script>');
SpreadsheetApp.getUi().showModalDialog(output,'Uploading...');
return DriveApp.getFolderById('xxxxxxxxxxxxxxxxxxxxxxxx').createFile(blob).getId();
}
function openHTML() {
SpreadsheetApp.getUi() // Or DocumentApp or SlidesApp or FormApp.
.createMenu('Upload Menu')
.addItem('Pokaz pasek boczny','showSidebar')
.addToUi();
}
function showSidebar() {
var html = HtmlService.createHtmlOutputFromFile('index.html')
.setTitle('Pasek boczny upload');
SpreadsheetApp.getUi()
.showSidebar(html);
}
function delFiles() {
var myFolder = DriveApp.getFolderById('xxxxxxxxxxxxxxxxxxxxxxxx');
var output = HtmlService.createHtmlOutput('<script>google.script.host.close();</script>');
while (myFolder.getFiles().hasNext()) {
const file = myFolder.getFiles().next();
Logger.log('Moving file to trash: ',file);
file.setTrashed(true);
SpreadsheetApp.getUi().showModalDialog(output,'Deleting...');
}
}
index.html 代码:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<input name="file" id="files" type="file" multiple>
<input type='button' value='Upload' onclick='getFiles()'>
<input type='button' value='Delete Files on Drive' onclick='delFilesOnDrive()'>
<input type='button' value='Refresh' onclick='filesRefresh()'>
<script>
function delFilesOnDrive() {
google.script.run.delFiles();
}
function filesRefresh() {
google.script.run.listFilesFromDrive();
}
function getFiles() {
const f = document.getElementById('files');
[...f.files].forEach((file,i) => {
const fr = new FileReader();
fr.onload = (e) => {
const data = e.target.result.split(",");
const obj = {fileName: f.files[i].name,mimeType: data[0].match(/:(\w.+);/)[1],data: data[1]};
google.script.run.withSuccessHandler((id) => {
console.log(id);
}).saveFile(obj);
}
fr.readAsDataURL(file);
});
}
</script>
</body>
</html>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。