那么如何在不重新排序行的情况下阅读App Script中的Google Drive文件内容?
所以这是我的情况:
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类型,但似乎没有做任何事情。我已将上述三个数据文件设置为公开可读,任何问题都让我知道。
那么如何在没有谷歌应用程序脚本的情况下阅读文件/ 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 )
}
}
运行此操作后,您应该会看到三列数据,第一列是错误的。
错误:
是否有可能在幕后谷歌使用一些Lua代码,然后对数据进行上下文敏感的解析(理解数据结构),然后以不同的顺序重新序列化?
当我看到您的共享电子表格时,似乎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 )
}
}
setContentTypeFromExtension()
设置正确的Lua mimeType。如果此修改无法解决您的问题,我向您道歉。