質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.36%

GAS 関数の入力プログラム(初心者)

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 596

YAMATO_K

score 4

前提・実現したいこと

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

+1

このエラーは{}が対になっておらず、functionが閉じられていないということです。

見たところ、chatMes関数の閉じ括弧(})が無いみたいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/14 21:46

    ありがとうございます!!
    保存できました~!!!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る