【Google Spread Sheet】RDB와 같이 복수 시트를 묶는 방법

7430 단어 GoogleAppsScript

소개



"일부 데이터를 연결하여 처리하고 싶지만 일부러 RDB를 사용할 정도는 아니다 ..."라고 할 때 어떻게 대처할까요?

RDB를 사용하는 사람도 있다면 Excel에서 함수를 구사하는 사람도 있다고 생각합니다. 로 정리해 보았습니다.

사용할 데이터



구단 마스터


  • 다음의 데이터를 「구단」이라고 하는 시트에 기술합니다.



  • ID
    구단명


    1
    거인

    2
    중일

    3
    야쿠르트

    4
    히로시마

    5
    DeNA

    6
    한신

    7
    소프트뱅크

    8
    세이부

    9
    라쿠텐

    10
    롯데

    11
    일본 햄

    12
    오릭스


    마스코트 마스터


  • 다음 데이터를 "마스코트"라는 시트에 설명합니다.



  • ID
    구단 ID
    이름


    1
    1
    자빗

    2
    1
    자매 자빗

    3
    1
    키즈 자빗

    4
    1
    할아버지 자빗

    5
    2
    도아라

    6
    3
    츠바쿠로

    7
    3
    츠바미

    8
    4
    슬러리

    9
    5
    DB.스타맨

    10
    6
    트래키

    11
    7
    해리 호크

    12
    7
    허니 호크

    13
    7
    허큐리 호크

    14
    7
    홍키 호크

    15
    7
    헬렌 호크

    16
    7
    해킹

    17
    7


    18
    7
    걸이

    19
    8
    레오

    20
    8
    라이나

    21
    9
    클러치

    22
    9
    클라치나

    23
    10
    마군

    24
    10
    린짱

    25
    10
    주 찬

    26
    11
    플랩

    27
    11
    폴리

    28
    12
    버팔로블

    29
    12
    버팔로벨


    버퍼용 시트


  • 데이터를 일시적으로 내보내는 버퍼 시트 (시트 이름 : buffer)를 준비합니다.

  • 작성한 코드


  • 구단명의 「야쿠르트」에 묶는 마스코트의 명칭을 메세지 박스에 표시합니다.
  • 1개의 구단에 묶는 마스코트는, 1 내지 복수로 되어 있는 점에 주의가 필요합니다.
  • function FindRelationRecords() {
    
      const SHEET_team = "球団"
      const SHEET_official_mascot = "マスコット"
    
      // シート関数のQUERYを使って、球団シートから指定した球団名(※B列)に該当する球団ID(※A列)を取り出す。
      let query_team = '=QUERY(\'' + SHEET_team + '\'!A1:B13,"SELECT A WHERE B=\'ヤクルト\'")'
      // 球団IDをbufferシートに書き込む
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName("buffer").getRange(1, 1).setFormula(query_team)
      // (1,1)セルは列名が書き込まれているため、1つ下の(2,1)セルから球団IDを取得する。
      let team_id = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("buffer").getRange(2, 1).getValue()
    
      // bufferシートをクリアする
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName("buffer").clear()
    
      // 球団IDをキーにして、マスコットを取り出す。
      let query_mascot = '=QUERY(\'' + SHEET_official_mascot + '\'!A1:C30,"SELECT C WHERE B=' + team_id + '")'
      SpreadsheetApp.getActiveSpreadsheet().getSheetByName("buffer").getRange(1, 1).setFormula(query_mascot)
      let mascot_names = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("buffer").getDataRange().getValues()
    
      // 配列の先頭の要素(※列名)を削除してメッセージボックスに出力する。
      mascot_names.shift()
      Browser.msgBox(mascot_names.join(','))
    }
    

    실행 결과


  • 구단명의 「야쿠르트」에 묶는 마스코트의 명칭이, 메세지 박스에 표시되었습니다.



  • 과제점


  • Query 함수의 결과를 버퍼 시트에 내보내기 때문에 약간의 처리에도 불구하고 코드 수가 늘어나고 있습니다.
  • 버퍼용 시트를 사용하지 않는 방법이 있는지를 조사해 보았습니다만, Query 함수를 사용하는 경우는 시트에의 기입이 필수인 것 같습니다.

  • 처리가 느리기 때문에, 대량의 데이터를 처리하기에는 전혀 적합하지 않습니다.
  • 어쩌면 극적으로 처리 속도를 높이는 방법이있을 수 있지만 GAS 초보자의 나에게는 알 수 없었습니다 ...

  • 좋은 웹페이지 즐겨찾기