Google
Formで取得したデータをBigQueryに蓄積したく、以下の記事を参考にスプレッドシートとBigQueryのテーブルの同期を試みていますがうまくいきません。

<https://techblog.gmo-ap.jp/2022/08/26/spreadsheet_bigquery/>

上手くいかない点  
記事では、name、price、numberの３データを扱っています。  
私の扱うデータは上記よりカラム数が多いです。

```

    timestamp(TIMESTAMP), 
    email(STRING), 
    name(STRING), 
    score(INTEGER),  
    comment(STRING)
    
```

書いてみたコード

```

    var FOLDERID = "Googleドライブに作成したフォルダ名"
    function save2Drive(filename, csv) {
      var destfolder = DriveApp.getFolderById(FOLDERID);
      return destfolder.createFile(filename, csv)
    }
    
    function importCSVtoBigQuery(table, file) {
      projectId = table.tableReference.projectId
      datasetId = table.tableReference.datasetId
      tableId = table.tableReference.tableId
    
      try {
        BigQuery.Tables.remove(projectId,datasetId, tableId)
      } catch (e) {
        Logger.log(e.toString());
      }
      BigQuery.Tables.insert(table, projectId, datasetId);
      data = file.getBlob().setContentType('application/octet-stream');
      var job = {
        configuration: {
          load: {
            destinationTable: {
              projectId: projectId,
              datasetId: datasetId,
              tableId: tableId
            },
            skipLeadingRows: 1
          }
        }
      };
      job = BigQuery.Jobs.insert(job, projectId, data);
      Logger.log('Job status for %s https://bigquery.cloud.google.com/jobs/%s', file.getName(), projectId);
    
    }
    
    SPREADSHEET_URL = "スプレッドシートのURL"
    function spreadsheet2Bigquery() {
      var sheets = SpreadsheetApp.openByUrl(SPREADSHEET_URL).getSheets();
      //BigQuery テーブルの項目
      var data_csv = "timestamp,email,name,score,comment\r\n";
      if (sheets.length >= 1) {
        for (var i = 0; i < sheets.length; i++) {
          if (!sheets[i].isSheetHidden()) {
            var range = sheets[i].getDataRange();
            var values = range.getValues();
            for (var j = 1; j < values.length; j++) {
              var timestamp = values[j][0].toString().trim()
              var email = values[j][1].toString().trim()
              var name = values[j][2].toString().trim()
              var score = values[j][3].toString().trim()
              var comment = values[j][4].toString().trim()
              data_csv += [timestamp, email, name, score, comment].join(",") + "\r\n";
            }
          }
        }
      }
      //BigQueryのprojectId、datasetId、table
      var projectId = 'プロジェクトID';
      var datasetId = 'データセットID';
      var table = {
        tableReference: {
          projectId: projectId,
          datasetId: datasetId,
          tableId: "テーブルID"
        },
        //BigQuery テーブルのshcema
        schema: {
          fields: [
            { name: 'timestamp', type: 'TIMESTAMP' },
            { name: 'email', type: 'STRING' },
            { name: 'name', type: 'STRING' },
            { name: 'score', type: 'INTEGER' },
            { name: 'comment', type: 'STRING' },
          ]
        }
      };
      var data_csv_file = save2Drive("csvのファイル名", data_csv)
      importCSVtoBigQuery(table, data_csv_file)
    }
    
```

コードの意図がわからなく、エラーとなる箇所は下記の部分です。

```

      if (sheets.length >= 1) {
        for (var i = 0; i < sheets.length; i++) {
          if (!sheets[i].isSheetHidden()) {
            var range = sheets[i].getDataRange();
            var values = range.getValues();
            for (var j = 1; j < values.length; j++) {
              var timestamp = values[j][0].toString().trim()
              var email = values[j][1].toString().trim()
              var name = values[j][2].toString().trim()
              var score = values[j][3].toString().trim()
              var comment = values[j][4].toString().trim()
              data_csv += [timestamp, email, name, score, comment].join(",") + "\r\n";
            }
          }
        }
      }
    
```

わからないポイント

```

    var timestamp = values[j][0].toString().trim()
    
```

このへんがわかりません。

オリジナルではこう書かれています。

```

      var data_csv = "name,price,number\r\n";
      if (sheets.length >= 1) {
        for (var i = 0; i < sheets.length; i++) {
          if (!sheets[i].isSheetHidden()) {
            var range = sheets[i].getDataRange();
            var values = range.getValues();
            for (var j = 1; j < values.length; j++) {
              var name = values[j][0].toString().trim()
              var price = values[j][1].toString().trim() + "_" + values[j][cate_index2].toString().trim()
              var number = values[j][2].toString().trim()
              data_csv += [name, price, number].join(",") + "\r\n";
            }
          }
        }
      }
    
```

オリジナルの記事を参考にしたのですが、カラムが増えた場合のことに言及されていないので、応用の仕方がわからないのです。  
[j][0]は何を意味しているのか？  
オリジナルのコードにおいて、nameに続いて、price、numberを定義するに従って[1][2]と増えているのはなぜなのか。  
この法則に従って単純に増やしたカラム分[3][4]と増やしてもダメでした。同じ値のカラムが増殖したり、意図しない結果で出力される状態でした。

試してみたコード

ググり方もわからなかったため、雑な質問になってしまい恐れ入ります。

よろしくお願いします。
CC BY-SA 4.0
2022-10-12T13:19:32.510
91566
2022-10-12T16:55:54.753
2022-10-12T16:55:54.753
3060
41311
question
javascript google-apps-script
SpreadsheetのデータをBigQueryのテーブルに送信し、シートが更新されたらテーブルも自動で更新したい