@Toshiki0324
Revisions
Report this question
Subscribe question
Help us understand the problem. What is going on with this question?
Q&A

LINEからgoogleスプレッドシートに登録する方法

解決したいこと

LINEからのメッセージをgoogleのspreadsheetsに挿入する際に受け取った日時も取得したい。

発生している問題・エラー

2行目から10行目のようにしたいが現状はLINEBOTからメッセージを
送ると11行目のようになる。日付とメッセージのみ。
Image from Gyazo

該当するソースコード

index.js
//対象のスプレッドシートのID(対象のURLを開いてURLの「https://docs.google.com/spreadsheets/d/」以降から「/edit#gid=0」の間の文字列)

var SPREADSHEET_ID = '';
function doPost(e) {
  // ユーザーのメッセージを取得
  var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
  var messageParameter = userMessage;

  //対象のスプレッドシートを取得
  var targetSs = SpreadsheetApp.openById(SPREADSHEET_ID);
  //対象のシート取得
  var targetSht = targetSs.getSheetByName('シート1');
  //最終行取得
  var lastRow = targetSht.getLastRow();
  //現在年月日取得
  var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', "yyyy/MM/dd");
  var date2 = Utilities.formatDate(new Date(), 'Asia/Tokyo', "HH:mm:ss");
  var date3 = Utilities.formatDate(new Date(), 'Asia/Tokyo', "yyyy/MM/dd HH:mm:ss");
  Logger.log(date);
  Logger.log(date2);

//各セルに書き込み
//A列に記入年月日
  targetSht.getRange('A' + (lastRow + 1)).setValue(date);
//B列
  targetSht.getRange('B' + (lastRow + 1)).setValue(messageParameter);
  targetSht.getRange('C' + (lastRow + 1)).setValue(date);
  targetSht.getRange('D' + (lastRow + 1)).setValue(date2);



  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

自分で試したこと

LINEに関する部分を消して(下記コード)、日付の取得のみで、関数の実行をすると下記の画像のようにうまく日付が入る。

index.js
//対象のスプレッドシートのID(対象のURLを開いてURLの「https://docs.google.com/spreadsheets/d/」以降から「/edit#gid=0」の間の文字列)

var SPREADSHEET_ID = '';
function doPost(e) {
  // ユーザーのメッセージを取得
//  var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
//  var messageParameter = userMessage;

  //対象のスプレッドシートを取得
  var targetSs = SpreadsheetApp.openById(SPREADSHEET_ID);
  //対象のシート取得
  var targetSht = targetSs.getSheetByName('シート1');
  //最終行取得
  var lastRow = targetSht.getLastRow();
  //現在年月日取得
  var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', "yyyy/MM/dd");
  var date2 = Utilities.formatDate(new Date(), 'Asia/Tokyo', "HH:mm:ss");
  var date3 = Utilities.formatDate(new Date(), 'Asia/Tokyo', "yyyy/MM/dd HH:mm:ss");
  Logger.log(date);
  Logger.log(date2);

//各セルに書き込み
//A列に記入年月日
  targetSht.getRange('A' + (lastRow + 1)).setValue(date);
//B列
//  targetSht.getRange('B' + (lastRow + 1)).setValue(messageParameter);
  targetSht.getRange('C' + (lastRow + 1)).setValue(date);
  targetSht.getRange('D' + (lastRow + 1)).setValue(date2);



  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

Image from Gyazo

0
1
Answer
Report this answer

単純にtypoでB列に2回値を入れていませんか?

 //B列
   targetSht.getRange('B' + (lastRow + 1)).setValue(messageParameter);
-  targetSht.getRange('B' + (lastRow + 1)).setValue(date);
+  targetSht.getRange('C' + (lastRow + 1)).setValue(date);
   targetSht.getRange('D' + (lastRow + 1)).setValue(date2);
0
回答ありがとうごさいます。上記の部分Cに変えましたが機能しませんでした。
なるほど、そうでしたか。
私の中で考えうる正しく動かない理由は2つで、

・C・D列のsetValue実行前に、処理がエラーで落ちて書き込まれていない
・あるいはC・D列に書き込まれた後に、何かしらの理由でブランクに上書きされてしまっている

後者はソースコード見る限りは無さそうな気はしますが。

前者の確認のためにtry catch入れてみたり、

try {
targetSht.getRange('A' + (lastRow + 1)).setValue(date);
targetSht.getRange('B' + (lastRow + 1)).setValue(messageParameter);
targetSht.getRange('C' + (lastRow + 1)).setValue(date);
targetSht.getRange('D' + (lastRow + 1)).setValue(date2);
} catch (e) {
// TODO: 変数eをログに吐き出すかレスポンスで返す
}

もしくはmessageParameterのsetValueをしている行を、CとDより後ろで実行してみると何か分かるかもしれません。

また、Rangeを一括で指定しsetValuesで一気に流し込んでみると何か変わるかもしれません。
getRange, setValueする度にスプレッドシートと通信が走るため、1セルごとsetValueするより処理時間も短く済む効果もあります。

var targetRow = lastRow+ 1;
.getRange("A" + targetRow + ":D" + targetRow).setValues([[date, messageParameter, date, date2]]);
ありがとうございます。無事に代入できました!本当に助かりました!
原因よく分からないですが、解決したようで何よりです!
View the remaining 3 comments.
Help us understand the problem. What is going on with this answer?
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login