前提条件・実現したいこと
スプレッドシートに下記のようなデータがあります。
ID | 日付 | 名前 | 出席 |
---|---|---|---|
id | date | name | attend |
1 | 2021/07/01 | 立花 | FALSE |
2 | 2021/07/02 | 橘 | TRUE |
3 | 2021/07/03 | 柳 | FALSE |
4 | 2021/07/04 | 桔梗 | TRUE |
5 | 2021/07/05 | 楓 | FALSE |
また、MYSQLには、下記のようなデータがあります
id | date | name | attend |
---|---|---|---|
1 | 2021/07/11 | テスト | FALSE |
2 | 2021/07/12 | test | TRUE |
3 | 2021/07/13 | ファイル | FALSE |
4 | 2021/07/14 | file | TRUE |
5 | 2021/07/15 | 書き込み | FALSE |
スプレッドシートのデータをUrlFetchApp.fetch関数を用いてPHPにJSON形式のデータとして、値を渡します。
PHPにJSON形式で値を渡して、MySQLに書き込みます。
問題点
GASからPHPに、jsonデータはわたっていますが、MYSQLの方に書き込みされていません。
ソース
test.gs
GAS
1//データ取得 2function getData() { 3 //データ取得するシート(現在開いているシートを指定) 4 var sheet = SpreadsheetApp.getActiveSheet(); 5 6 //行(横軸)と列(縦軸)の最大数を取得 7 var maxRow = sheet.getLastRow(); 8 var maxColumn = sheet.getLastColumn(); 9 10 //JSON用のkey 11 var keys = []; 12 13 //データ格納配列 14 var data = []; 15 16 //2行目のkeyの名前取得 17 //1行目は管理しやすいよう日本語で記述し、 18 //JSON用のラベルは2行目で指定しているため 19 //【getRange】の第1引数は【2】 20 for (var x = 1; x <= maxColumn; x++) { 21 keys.push(sheet.getRange(2, x).getValue()); 22 } 23 24 //データの取得 25 //実際のデータが3行目からなので【y = 3】から開始 26 //getRange()を使って、3行目1セル ~ 最終行目の最終セルを範囲指定 27 var _values = sheet.getRange(3, 1, maxRow, maxColumn).getValues(); 28 29 for(var i = 0; i < _values.length - 2 ; i++){ 30 var json = {}; 31 for (var k = 0; k < _values[i].length; k++) { 32 json[keys[k]] = _values[i][k]; 33 } 34 data.push(json); 35 } 36 37 console.log(data); 38 39 //オプションに入れる 40 var options = { 41 'method' : 'POST', 42 'Content-Type' : 'application/json', 43 'payload' : JSON.stringify(data) 44 }; 45 var response = UrlFetchApp.fetch('test_index.phpp', options); 46 console.log(JSON.stringify(data)); 47 return response; 48}
test_index.php
PHP
1<?php 2 3 function console_log($data) 4 { 5 echo '<script>'; 6 echo 'console.log(' . json_encode($data) . ')'; 7 echo '</script>'; 8 } 9 10 require("./mysql_control.php"); 11 12 $dbh = new PDO( 13 $dsn, 14 $db_user, 15 $db_password, 16 array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`") 17 ); 18 19 $json_string = file_get_contents('php://input'); 20 $oJson = json_decode($json_string, true); 21 $date = $oJson->date; 22 $name = $oJson->name; 23 $attend = $oJson->attend; 24 25 $log = $date . "\n" . $name . "\n" . $attend . "\n"; 26 console_log($log); 27 28 file_put_contents( "data.json", json_encode($oJson, JSON_UNESCAPED_UNICODE)); 29 30 if($date != "" || $name != "" || $attend != ""){ 31 $sql = 'INSERT IGNORE INTO commute ( 32 `date`, 33 `name`, 34 `attend`) VALUES (:date, :name, :attend)'; 35 36 $stmt = $dbh->prepare($sql); 37 $stmt->bindParam(':date', $date, PDO::PARAM_STR); 38 $stmt->bindParam(':name', $name, PDO::PARAM_STR); 39 $stmt->bindParam(':attend', $attend, PDO::PARAM_BOOL); 40 41 $dbh->beginTransaction(); 42 foreach($oJson as $datum){ 43 $date = $datum['date']; 44 $name = $datum['name']; 45 $attend = $datum['attend']; 46 $stmt->execute(); 47 } 48 49 $dbh->commit(); 50 51 } 52 53 ?>
試したこと
PHP
1 $sql = 'INSERT IGNORE INTO commute ( 2 `date`, 3 `name`, 4 `attend`) VALUES (:date, :name, :attend)'; 5 6 $stmt = $dbh->prepare($sql); 7 8 $dbh->beginTransaction(); 9 foreach($oJson as $datum){ 10 $stmt->bindValue(':date', $datum['date'], PDO::PARAM_INT); 11 $stmt->bindValue(':name', $datum['name'], PDO::PARAM_INT); 12 $stmt->bindValue(':attend', $datum['attend'], PDO::PARAM_INT); 13 $stmt->execute(); 14 }
bindParamのところをbindValueのパターンに変えてみても、MySQLの書き込みは出来ませんでした。
GASからスプレッドシートのデータをJSON形式でtest_index.phpにPOSTし、JSON形式のデータをMySQLに書き込みたいです。
皆様方のお力をお借りできればと思います。
hentaiman様からご指摘を頂いたソースでjsonが確認できたとされるところ
test.gs
gas
1 //オプションに入れる 2 var options = { 3 'method' : 'POST', 4 'Content-Type' : 'application/json', 5 'payload' : JSON.stringify(data) 6 }; 7 var response = UrlFetchApp.fetch('test_index.phpp', options); 8 console.log(JSON.stringify(data)); 9 return response;
test_index.php
php
1$json_string = file_get_contents('php://input'); 2$oJson = json_decode($json_string, true); 3file_put_contents( "data.json", json_encode($oJson, JSON_UNESCAPED_UNICODE));
で、test.gsを実行すると確認できました。
file_put_contents( "data.json", json_encode($oJson, JSON_UNESCAPED_UNICODE));
で、data.jsonに書き込んだところ、下記のデータを得ることが出来ました。
json
1[{"id":1,"date":"2021-06-30T15:00:00.000Z","name":"立花","attend":false}, 2{"id":2,"date":"2021-07-01T15:00:00.000Z","name":"橘","attend":true}, 3{"id":3,"date":"2021-07-02T15:00:00.000Z","name":"柳","attend":false}, 4{"id":4,"date":"2021-07-03T15:00:00.000Z","name":"桔梗","attend":true}, 5{"id":5,"date":"2021-07-04T15:00:00.000Z","name":"楓","attend":false}]
回答2件
あなたの回答
tips
プレビュー