문계에서도 알 수 있는, GAS에 의한 수업 통지의 LINE bot의 작성 그 ③
9278 단어 LINEmessagingAPIlinebotgas
문장에서도 알 수 있는 GAS에 의한 수업통지의 LINE bot 작성
이 기사에서 이해
이번에 할 일
흐름(요구사항 정의)
다음 수업을 얻는 함수 만들기
Code.gsfunction 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.gsvar 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 작성
Reference
이 문제에 관하여(문계에서도 알 수 있는, GAS에 의한 수업 통지의 LINE bot의 작성 그 ③), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ko001/items/c2b1367a6c935acbdfa0
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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(){
//②で作ったもの
}
이번까지의 완성형의 코드가 됩니다.
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 작성
Reference
이 문제에 관하여(문계에서도 알 수 있는, GAS에 의한 수업 통지의 LINE bot의 작성 그 ③), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Ko001/items/c2b1367a6c935acbdfa0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)