GAS 関数の入力プログラム(初心者)
受付中
回答 1
投稿
- 評価
- クリップ 1
- VIEW 596
前提・実現したいこと
GASで担当通知シートを作成しています。
スプレから担当者名とIDを抜き出し、チャットワークに通知したいのですが、エラーがでます。
初心者で、どこが間違えているのかわからず悩んでいます。
間違えている部分と解決方法をご教示ください。
発生している問題・エラーメッセージ
関数の本文の後に } がありません。(行 206、ファイル「コピー ~ コード」)
該当のソースコード
//祝日一覧をカレンダーから取得
var SHEET_URL = "https://docs.google.com/spreadsheets/d/1XyE7sPMHNYybQ7BvjXhIJyL0cmelWHNZzXWcIwUEslo/";
var SHEET_NAME = "祝日一覧";
function holiday_main() {
// 今年の1/1から
var startDate = new Date();
startDate.setMonth(0, 1);
startDate.setHours(0, 0, 0, 0);
// 来年の12/31まで
var endDate = new Date();
endDate.setFullYear(endDate.getFullYear() + 1, 11, 31);
endDate.setHours(0, 0, 0, 0);
var sheet = getholidaysheet();
var holidays = getHoliday(startDate, endDate);
var lastRow = sheet.getLastRow();
var startRow = 1;
// シートが空白で無いとき、取得した祝日配列の先頭の日付と一致するカラムの位置を探索
if (lastRow > 1) {
var values = sheet.getRange(1, 1, lastRow, 1).getValues();
for(var i = 0; i < lastRow; i++) {
if(values[i][0].getTime() == holidays[0][0].getTime()) {
break;
}
startRow++;
}
}
sheet.getRange(startRow, 1, holidays.length, holidays[0].length).setValues(holidays);
}
/**
* SHEET_URLで指定したドキュメント内のSHEET_NAMEのシートを取得する
* SHEET_NAMEのシートが存在しない時は、シートを作成する
*/
function getholidaysheet(){
var ss = SpreadsheetApp.openByUrl(SHEET_URL);
var sheet = ss.getSheetByName(SHEET_NAME);
if(sheet == null) {
sheet = ss.insertSheet(SHEET_NAME);
}
return sheet;
}
/**
* startDate〜endDateまでの祝日をgoogleカレンダーの「日本の祝日」から取得
* [日付,祝日名]の多次元配列にした上で返す
*/
function getHoliday(startDate, endDate) {
var cal = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
var holidays = cal.getEvents(startDate, endDate);
var values = [];
for(var i = 0; i < holidays.length; i++) {
values[i] = [holidays[i].getStartTime(), holidays[i].getTitle()];
}
return values;
}
//CWへの通知の準備(担当表スプレ)
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Twitter担当表のテスト");
var num = sheet.getRange('H2').getValue();
var name = sheet.getRange(num,3).getValue();
var toMes = sheet.getRange(num,4).getValue();
var toDay = new Date();
/*
対象の日付が休日かをチェックする。
targetDate:対象日
返り値
true:休日である
false:休日ではない
*/
function isHoliday(targetDate){
//土日か判定
var weekInt = toDay.getDay();
if(weekInt <= 0 || 6 <= weekInt){
return true;
}
//祝日か判定
var calendarId = "ja.japanese#holiday@group.v.calendar.google.com";
var calendar = CalendarApp.subscribeToCalendar(calendarId);
var events = calendar.getEventsForDay(toDay);
if(events.length > 0){
return true;
}
return false;
}
function chatMes(targetDate){
//休日ならば強制的にNG
if(isHoliday(targetDate)){
return true;
}
// chatworkにツイッター当番関連の情報を送信する
function sendChatwork(){
var obj = new Object();
// 必要な情報をセットする
obj = setInfos(obj);
// chatworkへメッセージを送信
sendMessage(obj);
// chatworkへタスクを追加
addTask(obj);
}
// 必要な情報をセットする
function setInfos(obj){
// APIトークン
obj.token = '▲▲▲▲▲▲▲▲▲';
// ルームID
obj.roomId = '●●●●●●';
// タスク内容
obj.task = 'ツイッター投稿当番です!';
// 期限
var date = new Date();
date = new Date(date.setDate(date.getDate()+0));
obj.limit = date.getTime()/1000;
// 宛先のシート情報を取得
var mySheet=SpreadsheetApp.openById("Xxxxxxxxx");
// シートの開始行番号、開始列番号を取得
var startRow = 2;
var startCol = 1;
// シートの最終行番号、最終列番号を取得
var endRow = mySheet.getLastRow() - 1; // 最初の行は不要なためマイナス1とする
var endCol = mySheet.getLastColumn();
// シートの範囲を指定して情報を取得
var sheetdata = mySheet.getSheetValues(startRow, startCol, endRow, endCol);
var dataCount = sheetdata.length;
//Logger.log('sheetdata:'+sheetdata);
// 送信内容のシート情報を取得
var subSheet = mySheet.getSheetByName("メッセージ");
var submitContent = subSheet.getRange(2, 1).getValue();
// ツイッター当番の名前を置換して挿入
var member = getMember(obj);
obj.body = "[To:" + obj.toIds.toFixed() + "]"+ member + "さん\n";
obj.body += submitContent.replace(/{NAME1}/,strName);
return obj;
}
// chatworkのルームからツイッター当番の名前を取得
function getMember(obj){
var params = {
headers : {"X-ChatWorkToken" : obj.token},
method : "get",
};
var url = "https://api.chatwork.com/v2/rooms/" + obj.roomId + "/members"
var response = UrlFetchApp.fetch(url, params);
// jsonをテキスト形式に変換
var json=JSON.parse(response.getContentText());
for(var i = 0; i < json.length; i++){
if(json[i]['account_id'].toFixed() == obj.toIds.toFixed()){
obj.name = json[i]['name'];
}
}
return obj.name;
}
// chatworkへツイッターの当番のメッセージを通知する
function sendMessage(obj){
var params = {
headers : {"X-ChatWorkToken" : obj.token},
method : "post",
payload : {
body : obj.body
}
};
var url = "https://api.chatwork.com/v2/rooms/" + obj.roomId + "/messages";
UrlFetchApp.fetch(url, params);
}
// chatworkへツイッターの当番のタスクを追加する
function addTask(obj){
var params = {
headers : {"X-ChatWorkToken" : obj.token},
method : 'post',
payload : {
body : obj.task,
limit : obj.limit.toFixed(),
to_ids : obj.toIds.toFixed()
}
};
var url = "https://api.chatwork.com/v2/rooms/" + obj.roomId + "/tasks";
UrlFetchApp.fetch(url, params);
}
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
このエラーは{}が対になっておらず、functionが閉じられていないということです。
見たところ、chatMes
関数の閉じ括弧(}
)が無いみたいです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/10/14 21:46
保存できました~!!!!!