의 Google API 클라이언트에서 Google 드라이브 사용 - Spreadsheet 작업

아래에서 대응한 것 같습니다.





이 문서는 무엇입니까?



google_drivegoogle-api-client을 동시에 사용하려고하면 google_drive가 google-api-client 버전 0.8을 사용하고 있으며 최신 0.9를 사용할 수 없으므로 Google Drive를 처리하는 데 google-api- client로 전부 할까라고 결의한 사람을 위한 문서.

코드는 pry에서 실행되었으므로 일부 결과를 올리고 있습니다.
service는 Google::Apis::DriveV3::DriveService.new입니다.

버전


  • google-api-client: 0.9.6

  • 도입편



  • Ruby Quickstart 보기

  • APIs Explorer에서 모든 Google API 사양을 볼 수 있습니다. 여기서 드라이브 API을 바라보고 무엇을 할 수 있는지 확인하십시오. 별도 드라이브 REST API 문서도 있습니다
  • google-api-client gem Reference를 본다. 여기에도 API 문서가 있다. DriveService을 보면 각 Drive API에 해당하는 ruby의 메소드 호출 형식을 알 수 있습니다.

  • Supported MIME Types을 보면 폴더를 만들 때 MEME Type과 tsv를 spreadsheet으로 변환 할 때 MIME Type을 알 수 있습니다

  • 드라이브 API 호출



    tsv 파일을 Spreadsheet 형식으로 업로드



  • 여기을 참고로 구현
  • file_metadata = {
      name: 'test',
      mime_type: 'application/vnd.google-apps.spreadsheet',
    }
    service.create_file(file_metadata, upload_source: 'data.tsv')
    => #<Google::Apis::DriveV3::File:0x007ffb66894e50
     @id="1zhbfOjzwSs5d4k0vTMYjJenB20JvkHjIkJgrsB6_y3U",
     @kind="drive#file",
     @mime_type="application/vnd.google-apps.spreadsheet",
     @name="test">
    

    확실히 할 수 있었습니다. mime_type을 붙이지 않으면 일반 tsv로 업로드됩니다. CSV로 업로드하고 싶을 때도 같은 느낌으로 갈 수 있습니다.


    폴더 만들기


    file_metadata = {
      name: 'test-folder',
      mime_type: 'application/vnd.google-apps.folder',
    }
    service.create_file(file_metadata, fields: 'id')
    => #<Google::Apis::DriveV3::File:0x007ffb6316a6f0 @id="0Byz3oGJQilf-a3hGbWVXV2ZSbXc">
    

    Spreadsheet을 특정 폴더 아래에 업로드



    조금 전에 만든 폴더에 넣어 보겠습니다.
    file_metadata = {
      name: 'test',
      mime_type: 'application/vnd.google-apps.spreadsheet',
      parents: ['0Byz3oGJQilf-a3hGbWVXV2ZSbXc']
    }
    service.create_file(file_metadata, upload_source: 'data.tsv')
    => #<Google::Apis::DriveV3::File:0x007ffb62f13050
     @id="10Wvb1xVGNsdB5ZQIGSDqzDCFToJxH4vh4CMEB2J34jc",
     @kind="drive#file",
     @mime_type="application/vnd.google-apps.spreadsheet",
     @name="test">
    

    특정 폴더의 기존 스프레드 시트를 특정 폴더 아래로 이동



    before-folder/test에서 after-folder/test로 파일을 이동합니다.
    file_id = '1zhbfOjzwSs5d4k0vTMYjJenB20JvkHjIkJgrsB6_y3U'  # before-folder/test
    after_folder_id = '0Byz3oGJQilf-aHBGUk9sMTN4N0U'
    file = service.get_file(file_id, fields: 'parents')
    previous_parents = file.parents.join(',')
    file = service.update_file(file_id,
                               add_parents: after_folder_id,
                               remove_parents: previous_parents,
                               fields: 'id, parents')
    => #<Google::Apis::DriveV3::File:0x007ffb62b92278
     @id="1zhbfOjzwSs5d4k0vTMYjJenB20JvkHjIkJgrsB6_y3U",
     @parents=["0Byz3oGJQilf-aHBGUk9sMTN4N0U"]>
    

    특정 폴더 아래에 있는 파일 나열



    페이징 없음
    response = service.list_files(q: "'0Byz3oGJQilf-aHBGUk9sMTN4N0U' in parents",
                                  spaces: 'drive',
                                  fields:'nextPageToken, files(id, name)')
    for file in response.files
      puts "Found file: #{file.name} #{file.id}"
    end
    

    페이징 있음
    page_token = nil
    begin
      response = service.list_files(q: "'0Byz3oGJQilf-aHBGUk9sMTN4N0U' in parents",
                                    spaces: 'drive',
                                    fields:'nextPageToken, files(id, name)',
                                    page_token: page_token)
      for file in response.files
        # Process change
        puts "Found file: #{file.name} #{file.id}"
      end
      page_token = response.next_page_token
    end while !page_token.nil?
    

    q 쿼리 방법은 Search for Files에서 찾을 수 있습니다.

    Spreadsheet 삭제



    삭제된 파일은 휴지통에 보관하지 않고 삭제됩니다.
    폴더를 지정하면 폴더 아래의 모든 파일이 지워집니다.
    service.delete_file('1zhbfOjzwSs5d4k0vTMYjJenB20JvkHjIkJgrsB6_y3U')
    

    Spreadsheet 복사



    from_id가 복사할 ID. parents는 속할 폴더를 지정합니다.
    file_metadata = {
      name: name,
      parents: [to_folder_id],
    }
    service.copy_file(from_id, file_metadata, {})
    

    스프레드시트 내용 읽기



    지금까지 Drive API를 통해 Spreadsheet을 업로드 할 수 있었으므로 그 내용을 조작하고 싶습니다.
    여기에 문제가 있습니다. Spreadsheet의 내용은 Drive API를 통해 조작 할 수 없습니다. 이 작업을 수행하려면 Sheet API을 통해 수행하거나 Apps Script을 실행하여 수행합니다.
    google_drive의 gem은 Sheet API를 통해 Spreadsheet를 조작하고 있지만 표현력이 다소 제한되어 있어 더 나은 느낌으로 조작하고 싶다면 Apps Script를 사용해야합니다.

    Apps Script를 Ruby에서 호출하는 기본 방법은 여기을 참조한다고 생각합니다. 또한 qiita의 다른 게시물에서 Apps Script를 사용하여 Spreadsheet의 역방향 조작 방법도 실었습니다.

    흔한 오류



    스크립트 실행 후 다음과 같은 오류가 발생할 수 있습니다.
    Unauthorized (Google::Apis::AuthorizationError)
    

    이 경우 SCOPE가 부족할 때가 있으므로 Google Apps Script를 직접보고 파일 -> 프로젝트 속성 -> 범위를 살펴보십시오.



    루비 스크립트에 실제로 위의 SCOPE가 포함되어 있는지 확인하십시오.

    후기



    여기까지 와서 Apps Script를 사용하는 흐름은 JavaScript를 쓸 필요가 있고 ruby로 완결할 수 없기 때문에 google_drive를 google-api-client의 0.9 대응하는 것도 하나의 손이라고 생각했습니다.
    google_dirve로 대응할 수 없는 것은 적절히, Apps Script로 하면, Ruby로 거의 걸리므로 편리하다고 합니다.

    좋은 웹페이지 즐겨찾기