Google 스프레드시트 API 가속화

TL;DR



스프레드시트 API는 어리석게 셀에 값을 설정하는 요청이라고 매우 느려진다.
사람이 화면에서 조작하는 요령으로 요청을 기술한다. 이에 따라 효율적인 API 실행이 되어 고속화로 이어진다.

전제 조건



기본 스프레드시트 API 사용법을 이해하고 있습니다.

이해하지 못한다 or 원래 Google 스프레드시트 API란 무엇인가? 라는 분은 이하의 기사를 부디.
Google 스프레드시트를 프로그래밍 방식으로 조작

만들고 싶은 스프레드시트



다음 값을 스프레드시트에 쓰려고 합니다.
  • A1에 1이 저장되고 오른쪽으로 진행할 때 1 씩 추가 (100까지)
  • 2행부터 100행까지는 1행째와 동일

  • 즉 100행✕100열이 되므로 10,000셀에의 쓰기가 됩니다.



    나쁜 예


    updateCells 요청만으로 10,000 셀에 쓰는 방법입니다.
    대략이지만 3초 정도로 반영됩니다.

    나쁜 예
    {
      "requests": [
        {
          "updateCells": {
            "start": {
                "sheetId": 0,
                "rowIndex": 0,
                "columnIndex": 0
            },
            "rows": [
              {
                "values": [
                  { "userEnteredValue": { "stringValue": "1"} },
                  { "userEnteredValue": { "stringValue": "2"} },
                  { "userEnteredValue": { "stringValue": "3"} },
                  { "userEnteredValue": { "stringValue": "4"} },
                  { "userEnteredValue": { "stringValue": "5"} },
                  { "userEnteredValue": { "stringValue": "6"} },
    ...こんなかんじで1万行になるので省略
    

    모든 데이터는 아래의 파일을 참조
    htps : // 기주 b. 이 m/호 wdy39/ゔぇり fy-sp레아 d시ぇ에 ts-아피/bぉb/마s테 r/인프 t다타/우p다테세 ls. j 그런

    좋은 예


    updateCells , autoFill , copyPaste 를 결합한 요청입니다.
    대체로 0.5~1초 정도로 반영됩니다.

    좋은 예
    {
      "requests": [
        {
          "updateCells": {
            "start": {
                "sheetId": 0,
                "rowIndex": 0,
                "columnIndex": 0
            },
            "rows": [
              {
                "values": [
                  { "userEnteredValue": { "stringValue": "1"} },
                ],
              },
            ],
            "fields": "userEnteredValue"
          }
        },
        {
          "autoFill": {
            "useAlternateSeries": false,
            "range": {
              "sheetId": 0,
              "startRowIndex": 0,
              "endRowIndex": 1,
              "startColumnIndex": 0,
              "endColumnIndex": 100,
            },
          }
        },
        {
          "copyPaste": {
            "source": {
              "sheetId": 0,
              "startRowIndex": 0,
              "endRowIndex": 1,
              "startColumnIndex": 0,
              "endColumnIndex": 100,          
            },
            "destination": {
              "sheetId": 0,
              "startRowIndex": 1,
              "endRowIndex": 100,
              "startColumnIndex": 0,
              "endColumnIndex": 100,
            },
          }
        }
      ]
    }
    

    이 요청이 각각을 분해하여 무엇을 하고 있는지는 다음과 같습니다.

    updateCells



    셀 A1에 1을 씁니다.

    autoFill



    셀 A1에서 가로 방향으로 열 100 셀까지 자동 채우기로 늘립니다.
    ※1행째에 1~100이 만들어진다.

    copyPaste



    첫 번째 행의 셀을 선택하여 두 번째 행에서 100번째 행으로 복사 붙여넣습니다.

    왜 그렇게 빨라진다?



    이것은 필자의 상상이지만 스프레드 시트 API는 브라우저 화면 조작을 에뮬레이트합니다.
    브라우저상에서 사람이 조작했을 때의 움직임을 그대로 API화한 것으로 봐도 좋다고 생각합니다.
    그 때문에 시트 조작 시스템 요청 에 오토필이나 카피 페이스트가 있는 것입니다.

    나쁜 예



    나쁜 예는 사람의 조작으로 말하면 다음과 같이 하나씩 셀에 값을 쓰는 것과 같습니다.
  • A1 셀에 1 쓰기
  • A2 셀에 2 쓰기
  • A3 셀에 3 쓰기
  • 이것이 1만회 계속된다

  • ※늦어지는 원인으로서 송신시의 리퀘스트 사이즈가 크다고 하는 것도 다소 있다고 생각합니다.

    좋은 예



    한편, 좋은 예는 사람의 조작과 마찬가지로 3 동작입니다.
  • A1 셀에 1 쓰기
  • A1 셀을 자동 채우기로 가로로 늘립니다
  • 첫 번째 줄을 복사하여 세로로 붙여 넣습니다.

    1만회의 조작이 3회가 되었기 때문에 빨라져 당연하다고 할 수 있겠지요.

    요약



    스프레드시트 API를 사용할 때는 브라우저 화면상을 조작하는 요령으로 보다 적은 액션(요청)으로 끝나게 하면 고속화할 수 있다.
  • 좋은 웹페이지 즐겨찾기