Итак, как мне прочитать содержимое файла Google Drive в App Script без переупорядочения строк? - PullRequest
2 голосов
/ 21 марта 2019

Так как мне прочитать содержимое файла Google Drive в App Script без переупорядочения строк?

Итак, вот моя ситуация:

  • У меня есть несколько файлов, которыетекстовое содержимое с расширениями .lua
  • Я скопировал их на мой Google Drive
    • Почему-то он считает, что это файлы изображений!Это может быть причиной моих основных проблем
  • Я пытаюсь прочитать их в сценарии, прилагаемом к таблице 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 - файл намного меньшего размера иa .txt , но он не ведет себя неправильно, и я получаю строки в правильном порядке
    • fileId3 - копия исходного файла, но расширение файла было изменено на .txt (и первая строка для наглядности).Это также не отображает ошибку, но все равно отображается в виде файла изображения

Кажется, что при возникновении ошибки строки с той же родительской строкой и одинаковыми отступамипорядок изменения уровня, возможно, основанный на некоторых хэш-значениях.Я попытался скопировать текст здесь, но не мог понять, что он разметка, и вопрос уже длинный.:)

Я пытался установить MIME-типы на BLOB-объекте до того, как прочел их, но, похоже, это ничего не дало.Я установил, что вышеупомянутые три файла данных доступны для публичного чтения, о каких-либо проблемах сообщите мне.

Итак, как вы читаете содержимое файла или большого двоичного объекта без скрипта Google App «услужливо», переупорядочивая их для вас?

Заранее спасибо за помощь

Редактировать:

Хорошо Я сделал демонстрационный проект: 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. Самый глубокий блок с отступом с ключами: (["itemLink"], ["timestamp"], ["price"], ["wasKiosk"], ["покупатель")], ["гильдия"], ["продавец"], ["квант"], ["id"]) все там, но в другом, но последовательном порядке.

  3. первый столбец каким-то образом приобретает начальный и конечный {}, которого нет в файле данных.

Возможно ли, что за кадром Google использует некоторыеLua-код, а затем он выполняет контекстно-зависимый анализ данных (понимает структуру данных), а затем повторно сериализуется в другом порядке?

1 Ответ

1 голос
/ 26 марта 2019

Когда я вижу вашу общую таблицу, кажется, что original file отличается от других. Но когда я запускаю ваш скрипт, результаты всех идентификаторов файлов совпадают. Я не мог воспроизвести вашу ситуацию.

Поэтому, хотя я не могу подтвердить, является ли это прямым решением вашей проблемы, в этой модификации я использовал 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 Drive, потому что mimeType изображения используется для данных Lua при загрузке файла Lua в Google Drive, а также правильный mimeType Lua нельзя установить с помощью setContentTypeFromExtension().
  • В вашем скрипте DriveApp уже используется. Поэтому я думаю, что область применения Drive API уже установлена, а также Drive API уже включена. Если возникает ошибка, связанная с Drive API, проверьте, включен ли Drive API на консоли API.

Справка:

Если это изменение не решило вашу проблему, я прошу прощения.

...