那么如何在不对行进行重新排序的情况下在App Script中读取Google云端硬盘文件的内容?
这是我的情况:
我正在尝试使用附加到Google Spreadsheet的脚本读取它们
function test_bug_readFile_linesInWrongOrder() {
var fileId1 = "12-YLK6Lv5UYNZIgkr-u-DBviwLIOr1F2" // orig file .lua
var fileId2 = "1fyvdHrc45Q_-G02XJ1ismCROKqcxyoPL" // test file shortened and .txt
var fileId3 = "1uw7gG869_yIhpYh2vY2iKtUU5njBRrwA" // test file same as orig but .txt
var file = DriveApp.getFileById( fileId1 )
var fileBlob = file.getBlob()
// var fileBlob = file.getBlob().setContentType( "text/plain" )
var raw = fileBlob.getDataAsString()
Logger.log( raw.length )
Logger.log( raw )
}
似乎发生错误时,可能具有某些哈希值的,具有相同父行和相同缩进级别更改顺序的行。我试图在此处复制文本,但无法弄清楚他的标记,问题已经很长了。 :)
在阅读它们之前,我曾尝试在Blob上设置MIME类型,但这似乎无济于事。 我已将上述三个数据文件设置为公开可读,任何问题都让我知道。
那么,如何在没有Google App脚本“帮助”地为您重新排序的情况下读取文件/ blob的内容?
提前感谢所有帮助
编辑:
好吧,我做了一个演示项目: https://docs.google.com/spreadsheets/d/1i_VqYANrqE5FXEQxFAx4dbheEJ89I8MwGSDrxenwHtU 您需要加载它,然后会出现一个标题为“ BugDemo”的菜单。一旦有了它,只需选择其中的唯一菜单项,您将获得一个权限对话框。我意识到您可能不想授予我的代码许可,所以我在下面的代码段中包含了代码,以便您可以创建自己的项目,并确保没有多余的后门或任何东西。
"use strict";
function onOpen() {
SpreadsheetApp.getUi().createMenu( 'BugDemo' )
.addItem( 'Read 3 Files and show first 10,000 chars', 'test_bug_readFile_linesInWrongOrder' )
.addToUi()
}
function test_bug_readFile_linesInWrongOrder() {
var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
sh.clear()
var fileIds = ["12-YLK6Lv5UYNZIgkr-u-DBviwLIOr1F2", // orig file .lua
"1fyvdHrc45Q_-G02XJ1ismCROKqcxyoPL", // test file shortened and .txt
"1uw7gG869_yIhpYh2vY2iKtUU5njBRrwA" // test file same as orig but .txt
]
var fileDescs = ["original file",
"much smaller file, also with .txt extension",
"same as first file but with extension of .txt"
]
for ( var col = 0; col < fileIds.length; col++ ) {
var fileId = fileIds[col]
var file = DriveApp.getFileById( fileId )
var fileBlob = file.getBlob()
var text = fileBlob.getDataAsString().slice( 0, 10000 )
var r = sh.getRange( 1, col + 1, 1, 1 )
r.setValue( fileId )
r.offset( 1, 0, 1, 1 ).setValue( file.getName() )
r.offset( 2, 0, 1, 1 ).setValue( fileDescs[col] )
r.offset( 4, 0, 1, 1 ).setValue( text )
}
}
运行该命令后,应该会看到三列数据,而第一列是错误的。
错误:
您 应该看到它直接从 [“ $ AccountWide”] 到 [“ SalesData”] ,其中数据文件中还有其他几行,如其他2列。
最深的缩进块,其键为:([[“ itemLink”],[“ timestamp”],[“ price”],[“ wasKiosk”],[“ buyer”],[“ guild”] ,[“ seller”],[“ quant”],[“ id”])都在那里,但顺序不同但一致。
第一列似乎以某种方式获取了不在数据文件中的开始和结束{}。
Google可能在后台使用了Lua代码,然后对数据进行了上下文敏感的解析(理解了数据结构),然后以不同的顺序重新序列化了?
答案 0 :(得分:1)
当我看到您共享的电子表格时,似乎original file
与其他人不同。但是,当我运行您的脚本时,所有文件ID的结果都相同。我无法复制你的情况。
因此,尽管我无法确认这是否是您问题的直接解决方案,但在此修改中,我使用Drive API v3而不是DriveApp来检索文件内容。
function test_bug_readFile_linesInWrongOrder() {
var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
sh.clear()
var fileIds = ["12-YLK6Lv5UYNZIgkr-u-DBviwLIOr1F2", // orig file .lua
"1fyvdHrc45Q_-G02XJ1ismCROKqcxyoPL", // test file shortened and .txt
"1uw7gG869_yIhpYh2vY2iKtUU5njBRrwA" // test file same as orig but .txt
]
var fileDescs = ["original file",
"much smaller file, also with .txt extension",
"same as first file but with extension of .txt"
]
for ( var col = 0; col < fileIds.length; col++ ) {
var fileId = fileIds[col]
var file = DriveApp.getFileById( fileId );
// var fileBlob = file.getBlob()
// var text = fileBlob.getDataAsString().slice( 0, 10000 )
var url = "https://www.googleapis.com/drive/v3/files/" + fileId + "?alt=media&access_token=" + ScriptApp.getOAuthToken(); // Added
var res = UrlFetchApp.fetch(url).getContentText(); // Added
var text = res.slice( 0, 10000 ); // Added
var r = sh.getRange( 1, col + 1, 1, 1 )
r.setValue( fileId )
r.offset( 1, 0, 1, 1 ).setValue( file.getName() )
r.offset( 2, 0, 1, 1 ).setValue( fileDescs[col] )
r.offset( 4, 0, 1, 1 ).setValue( text )
}
}
如果此修改不能解决您的问题,对不起。