

PHPの申し込みフォームに入力された内容をGoogleAppScriptを用いて、Googleスプレッドシートに自動入力するプログラムを作りたいと考えています。  
下記方法でも構いませんし、他に最適な方法があれば教えていただけると幸いです。

申し込みフォームがあるPHP側の一番上にこちらを書き加えました。

[code]

    <?php 
    if(isset($_POST['name'])){
    
        define('POST_URL', 'https://script.google.com/macros/s/AKfycbzU4OwOwY4DNMcDrnBCNguWGCyDGNVXU3tFa3-Kcg/exec');
    
        $post_data = [
            'name' => $_POST['name'],
            'hurigana' => $_POST['hurigana'],
            'email' => $_POST['email'],
            'tel' => $_POST['tel'],
            'juusyo' => $_POST['juusyo'],
            'company' => $_POST['company'],
            'other' => $_POST['other'],
            'hokenshinsei' => $_POST['hokenshinsei'],
            'rireki' => $_POST['rireki'],
            'date01' => $_POST['date01'],
            'date02' => $_POST['date02'],
            'date03' => $_POST['date03'],
            'date-comment' => $_POST['date-comment'],
            'txt' => $_POST['txt'],
        ];
    
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => POST_URL,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true, 
            CURLOPT_POSTFIELDS => http_build_query($post_data),
        ]);
        $response = curl_exec($ch);
        $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
        $header = substr($response, 0, $header_size);
        curl_close($ch);
    }
    ?>
    
[/code]

GASの方ではこの二つの関数を記述しています。

[code]

    function doPost(e) {
        var sheet = SpreadsheetApp.getActive().getSheetByName('データ');
        var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
        var last_row = sheet.getLastRow(); 
    
        if(headers[0] === 'timestamp'){
            sheet.getRange(last_row + 1, 1).setValue(Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm'));
        }
    
        for(var key in e.parameter){
            for(var i = 1; i < headers.length; i++){
                if(headers[i] === key){
                    sheet.getRange(last_row + 1, i + 1).setValue(e.parameter[key]);
                    break;
                } else if(headers.length === i + 1){
                    var new_column = sheet.getLastColumn() + 1;
                    sheet.getRange(1, new_column).setValue(key);
                    sheet.getRange(last_row + 1, new_column).setValue(e.parameter[key]);
                }
            }
        }
    }
    
    function pushBtn(){
        var sheet = SpreadsheetApp.getActive().getSheetByName('集計');
    
        var last_col = sheet.getLastColumn(); 
        var last_row = sheet.getLastRow(); 
        sheet.getRange(2,1,last_row,last_col).clear();
    
        last_row = sheet.getLastRow(); 
    
        var data_sheet = SpreadsheetApp.getActive().getSheetByName('データ');
        var data_headers = data_sheet.getRange(1, 2, 1, data_sheet.getLastColumn() -       1).getValues(); //headder取得
        var data_last_row = data_sheet.getLastRow(); 
    
        //開始日付終了日付行数をデータシートから取得
        var sobj = new Date(sheet.getRange(1, 2).getValue());
        var eobj = new Date(sheet.getRange(1, 3).getValue());
        eobj.setDate(eobj.getDate() + 1);
        var flg = false;
        var sdate_row, edate_row;
    
        for(var i = 0; i < data_last_row; i++){
            var tdate = data_sheet.getRange(i + 2, 1).getValue();
            var tobj = new Date(tdate);
    
            if(sobj < tobj && flg == false){
                sdate_row = i + 2;
                flg = true;
            }
            if(eobj  < tobj){
                edate_row = i + 1;
                break;
            }
            if(!edate_row){
                edate_row = data_last_row;
            }
        }
    
        for(var i = 0; i < data_headers[0].length; i++){
            sheet.getRange(last_row + 1 + i, 1).setValue(data_headers[0][i]);
            var myCurrentArray = data_sheet.getRange(sdate_row,i + 2,edate_row,1).getValues();
            var counts = {};
    
            for(var c=0;c< myCurrentArray.length;c++) {
                //Logger.log(c);
                var key = myCurrentArray[c];
                counts[key] = (counts[key])? counts[key] + 1 : 1 ;
            }
    
            var t = 0;
            for (var k in counts) {
                if (k != '' && counts.hasOwnProperty(k)) {
                    var value = counts[k];
                    sheet.getRange(last_row + 1 + i, t + 2).setValue(k + ':' + value);
                    t++;
                }
            }
        }
    }
    
[/code]

検証を重ねる中で、

[code]

    var sheet = SpreadsheetApp.getActive().getSheetByName('データ');
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var last_row = sheet.getLastRow(); 
    
[/code]

の部分に不備があることが分かったのですが、解決方法が見つかりません。  
手動でdoPost.gsを起動した場合、スプレッドシートのtimestampに日時が記入されていることは確認できました。  
ですが、PHPの申し込みフォームを入力した場合、スプレッドシートに日時が記入されてないため、当該箇所に問題があることがわかりました。

この場合の解決方法、もしくは別の方法がありましたら教えていただきたいです。


CC BY-SA 4.0
2020-12-06T11:10:32.463
72455
2020-12-06T14:50:55.867
2020-12-06T14:50:55.867
43041
43041
question
php google-apps-script google-spreadsheet
PHP申し込みフォームをGoogleスプレッドシートに自動入力