那么如何在不对行进行重新排序的情况下如何在App脚本中读取Google云端硬盘文件的内容?

时间:2019-03-21 18:24:05

标签: google-apps-script blob google-docs

那么如何在不对行进行重新排序的情况下在App Script中读取Google云端硬盘文件的内容?

这是我的情况:

  • 我有一些文件的文本内容带有文件扩展名 .lua
  • 我已将它们复制到我的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 )
    }
    
  • 运行此命令时,我得到文件的内容,但各行的顺序错误!您可以通过更改传递给getFileById(...)的参数来查看各种行为。
    • fileId1是原始文件,并显示以下错误
    • fileId2是一个小得多的文件,它是一个 .txt ,但它不会出现异常,我可以按正确的顺序获取行
    • fileId3是原始文件的副本,但文件扩展名已更改为 .txt (为清晰起见,第一行)。这也不会出现错误,但仍会显示为图像文件

似乎发生错误时,可能具有某些哈希值的,具有相同父行和相同缩进级别更改顺序的行。我试图在此处复制文本,但无法弄清楚他的标记,问题已经很长了。 :)

在阅读它们之前,我曾尝试在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 )
  }
}

运行该命令后,应该会看到三列数据,而第一列是错误的。

错误:

  1. 您 应该看到它直接从 [“ $ AccountWide”] [“ SalesData”] ,其中数据文件中还有其他几行,如其他2列。

  2. 最深的缩进块,其键为:([[“ itemLink”],[“ timestamp”],[“ price”],[“ wasKiosk”],[“ buyer”],[“ guild”] ,[“ seller”],[“ quant”],[“ id”])都在那里,但顺序不同但一致。

  3. 第一列似乎以某种方式获取了不在数据文件中的开始和结束{}。

Google可能在后台使用了Lua代码,然后对数据进行了上下文敏感的解析(理解了数据结构),然后以不同的顺序重新序列化了?

1 个答案:

答案 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 )
  }
}

注意:

  • 我认为Lua代码不会受到Google云端硬盘的影响,因为当Lua文件上传到Google云端硬盘时,图像的mimeType用于Lua数据,而且无法使用{{1}来设置Lua的正确mimeType }。
  • 在您的脚本中,DriveApp已被使用。因此,我认为使用Drive API的范围已经安装,并且Drive API也已启用。如果发生与Drive API相关的错误,请确认是否在API控制台上启用了Drive API。

参考:

如果此修改不能解决您的问题,对不起。