那么如何在不重新排序行的情况下阅读App Script中的Google Drive文件内容?

问题描述 投票:2回答:1

那么如何在不重新排序行的情况下阅读App Script中的Google Drive文件内容?

所以这是我的情况:

  • 我有一些文件内容的文件扩展名为.lua
  • 我已将它们复制到我的Google云端硬盘中 出于某种原因,它认为它们是图像文件!这可能是我主要问题的原因
  • 我试图在附加到Google电子表格的脚本中阅读它们 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类型,但似乎没有做任何事情。我已将上述三个数据文件设置为公开可读,任何问题都让我知道。

那么如何在没有谷歌应用程序脚本的情况下阅读文件/ 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”],[“买方”],[“公会”],[“卖方”] ,[“quant”],[“id”])都在那里,但是以不同但一致的顺序。
  3. 第一列似乎以某种方式获取了不在数据文件中的起始和结束{}。

是否有可能在幕后谷歌使用一些Lua代码,然后对数据进行上下文敏感的解析(理解数据结构),然后以不同的顺序重新序列化?

google-apps-script blob google-docs
1个回答
1
投票

当我看到您的共享电子表格时,似乎original file与其他人不同。但是当我运行您的脚本时,所有文件ID的结果都是相同的。我无法复制你的情况。

因此,虽然我无法确认这是否是您问题的直接解决方案,但在此修改中,我使用Drive API v3而不是DriveApp来检索文件内容。

Modified script:

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

Note:

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

Reference:

如果此修改无法解决您的问题,我向您道歉。

© www.soinside.com 2019 - 2024. All rights reserved.