문계에서도 알 수 있는, GAS에 의한 수업 통지의 LINE bot의 작성 그 ③

문장에서도 알 수 있는, GAS에 의한 수업 통지의 LINE bot의 작성 그 ② 의 계속입니다.
  • 문계에서도 알 수 있는, GAS에 의한 수업 통지의 LINE bot의 작성 그 ① ~GAS를 사용한 LINE bot의 작성~
  • 문계에서도 알 수 있는, GAS에 의한 수업 통지의 LINE bot의 작성 그 ② ~GAS와 스프레드시트의 제휴, 일자의 포맷~
  • 문계에서도 알 수 있는, GAS에 의한 수업 통지의 LINE bot의 작성 그 ③ ←이번

  • 문장에서도 알 수 있는 GAS에 의한 수업통지의 LINE bot 작성

  • 이 기사에서 이해


  • 날짜를 얻는 방법
  • 스프레드 시트에서 얻은 시간을 계산하는 방법

  • 이번에 할 일


  • 요건 ③ 「다음」을 입력하면, 1번 가까운 수업의 정보를 돌려주는 기능을 추가


  • 흐름(요구사항 정의)


  • "다음"을 포함하는 메시지가 입력되면
  • 지금의 일시를 취득해
  • 다음 수업에 대한 정보를 회신

  • 다음 수업을 얻는 함수 만들기



    Code.gs
    function findNextClass() {
      //今の日時を取得
      var today = new Date();
     //今の時間を取得
      var hour = today.getHours();
     //今の分を取得
      var minutes = today.getMinutes();
      console.log(today);
      for(let i=0; i <= 6; i++) {
      //今日の曜日から初めて、曜日を一つずつずらしていく
        var day = (today.getDay() + i) % 7;
        var dateColumn = day + 3;
        var array = ['日','月','火','水','木', '金', '土'];
      //何曜日を検索しているかコンソールに表示(デバッグ用)
        console.log("曜日:" + array[day]);
    
        var searchHour = 0;
      //もし、検索する曜日が今の曜日と一致しているなら今の時間から、そうじゃないなら朝6時から検索
        if(day == today.getDay()){searchHour = hour;} else { searchHour = 6;}
      //検索時間が24時になるまで、1時間ずつ足して計算する
        for(var j=0; j < 24-searchHour; j++) {
          console.log(searchHour + "時");
          for(let k=2; k <= 26; k+=4){
            var classNumRow = k;
            var startTimeRow = k + 1;  
            //始業時間が設定されている場合、始業時間を取得
            if(sheet.getRange(startTimeRow, 1).getValue()) {
              var startTime = sheet.getRange(startTimeRow, 1).getValue();
              var startHour = startTime.getHours();
              var startMinutes = startTime.getMinutes();
              console.log("start hour: " + startHour);
              //検索した時、今と検索時間の日付と時間が一致していても、今の分が始業の分を超えている場合は情報を取得しない          
              if(searchHour === startHour && today.getDay() === day && hour === searchHour && minutes > startMinutes){
                console.log("\nalready orver\n");
                //時間が一致し、授業が存在する場合、情報を取得
              } else if(searchHour === startHour && sheet.getRange(classNumRow, dateColumn).getValue()){
                var classInfos = getClassInfo(classNumRow, dateColumn);
                return classInfos;
              }
            }
          }
        //検索時間を1時間足す
          searchHour += 1;
        }
      }  
    }
    
    function getClassInfo(){
      //②で作ったもの
    }
    

    해설
    지금의 시간에 1시간씩 더해 가는 형태로 검색해 갑니다. 분은 무시하고 XX시 YY분의 XX가 시작시간과 일치했을 때 그 수업의 정보를 반환합니다.
    다만, 이것이라고 지금이 10:35로 시업이 같은 요일의 10:30의 경우등에 수업의 정보를 취득해 버리므로, if(searchHour === startHour && today.getDay() === day && hour === searchHour && minutes > startMinutes) 를 사용하고 있습니다.
    이전 기사에서 쓴 것처럼 스프레드시트에 기입한 시간은 이상한 날짜가 설정되어 버리기 때문에 시간과 분을 흩어지게 취급하여 날짜를 무시할 수 있도록 하고 있습니다.

    function findNextClass 를 function doPost(e) 로 움직이게 한다



    이번까지의 완성형의 코드가 됩니다.

    Code.gs
    var access_token = "自分のアクセストークン"
    // 自分のユーザーIDを指定します。LINE Developersの「Your user ID」の部分です。
    var user_id = "ユーザーID"
    
    //★★スプレッドシートID★★
    var ss = SpreadsheetApp.openById("スプレッドシートID");
    //★★シート名★★
    var sheet = ss.getSheetByName("シート名");
    
    function doPost(e) {
      var event = JSON.parse(e.postData.contents).events[0];
      var returnMessage = "曜日と時限(半角:1〜7)を指定してね!\n次の授業が知りたいときは、「次」と入力してね!";
      if(event.source.userId == user_id){
        //返信するためのトークン取得
        var reply_token= event.replyToken;
        if (typeof reply_token === 'undefined') {
          return;
        }
        var message = event.message.text;
        for(let i=3; i<=7; i ++) {
          var dateColumn = i;
          var day = sheet.getRange(1, i).getValue();
          if(message.includes(day)){
            for(let j=2; j<=26; j += 4) {
              var classNumRow = j;
              var classNum = sheet.getRange(j, 1).getValue();
              if(message.includes(classNum) && sheet.getRange(classNumRow, dateColumn).getValue()){
                var classInfos = getClassInfo(classNumRow, dateColumn);
                var returnMessage = classInfos.classDay + "曜" + classInfos.classNum + "限 (" + classInfos.startTime + "-" + classInfos.endTime + 
                  ")\n授業名:" + classInfos.className + 
                    "\nZoomID: " + classInfos.zoomID + 
                      "\nPass: " + classInfos.zoomPass;
                reply(reply_token, returnMessage);
              } else if(message.includes(classNum) && !sheet.getRange(classNumRow, dateColumn).getValue()) {
                var returnMessage = "授業はありません。"
                reply(reply_token, returnMessage);
              }
            }
          }
        }
    
        if(message.includes("次")){
          var classInfos = findNextClass();
          var returnMessage = classInfos.classDay + "曜" + classInfos.classNum + "限 (" + classInfos.startTime + "-" + classInfos.endTime + 
            ")\n授業名:" + classInfos.className + 
              "\nZoomID: " + classInfos.zoomID + 
                "\nPass: " + classInfos.zoomPass;
          reply(reply_token, returnMessage);
        } else {reply(reply_token, returnMessage);}
      }
    }
    
    function reply(reply_token, returnMessage) {
      var reply_url = 'https://api.line.me/v2/bot/message/reply';
    
      // メッセージを返信 
      UrlFetchApp.fetch(reply_url, {
        'headers': {
          'Content-Type': 'application/json; charset=UTF-8',
          'Authorization': 'Bearer ' + access_token,
        },
        'method': 'post',
        'payload': JSON.stringify({
          'replyToken': reply_token,
          'messages': [{
            'type': 'text',
            'text': returnMessage,
          }],
        }),
      });
      return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
    }
    
    function findNextClass() {
      var today = new Date();
      var hour = today.getHours();
      var minutes = today.getMinutes();
      console.log(today);
      for(let i=0; i <= 6; i++) {
        var day = (today.getDay() + i) % 7;
        var dateColumn = day + 3;
        var array = ['日','月','火','水','木', '金', '土'];
        console.log("曜日:" + array[day]);
    
        var searchHour = 0;
        if(day == today.getDay()){searchHour = hour;} else { searchHour = 6;}
        for(var j=0; j < 24-searchHour; j++) {
          console.log(searchHour + "時");
          for(let k=2; k <= 26; k+=4){
            var classNumRow = k;
            var startTimeRow = k + 1;  
            //始業時間が設定されている場合、始業時間を取得
            if(sheet.getRange(startTimeRow, 1).getValue()) {
              var startTime = sheet.getRange(startTimeRow, 1).getValue();
              var startHour = startTime.getHours();
              var startMinutes = startTime.getMinutes();
              console.log("start hour: " + startHour);
              //検索した時、今と検索時間の日付と時間が一致していても、今の分が始業の分を超えている場合は情報を取得しない          
              if(searchHour === startHour && today.getDay() === day && hour === searchHour && minutes > startMinutes){
                console.log("\nalready orver\n");
                //時間が一致し、授業が存在する場合、情報を取得
              } else if(searchHour === startHour && sheet.getRange(classNumRow, dateColumn).getValue()){
                var classInfos = getClassInfo(classNumRow, dateColumn);
                return classInfos;
              }
            }
          }
          searchHour += 1;
        }
      }  
    }
    
    function getClassInfo(rowNum, dateColumn){
      var className = sheet.getRange(rowNum, dateColumn).getValue();
      var classDay = sheet.getRange(1, dateColumn).getValue();
      var classNum = sheet.getRange(rowNum, 1).getValue();
      var startTime = Utilities.formatDate( sheet.getRange(rowNum + 1, 1).getValue(), 'Asia/Tokyo', 'HH:mm');
      var endTime = Utilities.formatDate( sheet.getRange(rowNum + 3, 1).getValue(), 'Asia/Tokyo', 'HH:mm');
      var zoomID = sheet.getRange(rowNum + 1, dateColumn).getValue();
      var zoomPass = sheet.getRange(rowNum + 2, dateColumn).getValue();
      var classInfos = {className: className, classDay: classDay, classNum: classNum, startTime: startTime, endTime: endTime, zoomID: zoomID, zoomPass: zoomPass};
      return classInfos;
    }
    

    여기까지 할 수 있으면, 또 갱신해, 「다음」이라고 메세지를 보내서 올바르게 움직이는지 확인해 봅시다.

    다음글↓
    문장에서도 알 수 있는 GAS에 의한 수업통지의 LINE bot 작성

    좋은 웹페이지 즐겨찾기