見出し画像

つかえる自動化/効率化 「スプレッドシートからLINEへメッセージ」- プログラム解説編

【つかえる自動化/効率化 「スプレッドシートからLINEへメッセージ」- 登録があったらLINEで知りたいよね✨】のプログラム解説編です。

⬇️ 詳細はこちら ⬇️

上記の note では、スプレッドシートに記載した内容(メッセージやスタンプ)を LINE に送る!という内容でした。

「プログラム解説編」では、実際にどのように実現しているか、プログラムの解説を行っていきたいと思います。

  • プログラミングしてみたい

  • 少しだけ改良してもっと使いやすくしてみたい

  • スキルアップしたい

  • プログラミングを学んで活躍の場を増やしたい

などなど、考えているあなたのための一助となるよう頑張ってみます😁



スプレッドシートからデータの読み取り

// 開いているスプレッドシート
const ss = ssc.getSpreadSheet();
// 開いているシート
const sheet = ss.getActiveSheet();
// 行番号を取得
const row = sheet.getActiveCell().getRow();
// 行全体を選択
const range = sheet.getRange(row,1,1,sheet.getLastColumn());
// 行全体のデータを取得
let values = range.getValues();
// 1行目のみを取得
let value = values[0];
  1. スプレッドシートを開く

  2. シートを開く

  3. シート内のエリアを指定する

  4. 指定したエリアのデータを取得する

という手順でデータを取得します。
今回は、1行のデータを処理しますので、1行ずつデータを取得しています。

⬇️ 以下は使用しているクラス ⬇️

入力内容の確認

LINE に限らずですが、外部のサービスを利用する場合、あまりおかしなデータを送り続けると "悪質なアタック" ととらえられないとも限りません。

そのため、正常なデータのみを送るようにした方がベターです。

そこで、今回は一定の入力確認を行って、異常なデータが入力されていた場合は送らない、というようにしています。

function checkDetail(values)
{
  let res = true;

  switch(values[INDEX_KIND])
  {
    case "テキスト":
      // メッセージは空ではダメ
      if(values[INDEX_MESSAGE]===""){...}
      break;
    case "スタンプ":
      // メッセージは空ではダメ
      if(values[INDEX_MESSAGE]===""){...}
      // パッケージID と スティッカーID が空ではダメ
      else if(values[INDEX_DATA1]===""||values[INDEX_DATA2]===""){...}
      // パッケージID と スティッカーID は半角数字でないとダメ
      else if(typeof(values[INDEX_DATA1])!="number"||typeof(values[INDEX_DATA2])!="number"){...}
      break;
    case "画像":
      // メッセージは空ではダメ
      if(values[INDEX_MESSAGE]===""){...}
      // 画像ID が空ではダメ
      else if(values[INDEX_DATA1]===""){...}
      else
      {
        try
        {
          // Googleドライブ内に画像が存在するかどうか
          const file = DriveApp.getFileById(values[INDEX_DATA1]);
        }
        catch{...}
      }
      break;
    default: ... break;
  }
  • メッセージは必須なので、空では無いかどうか

  • パッケージID と スティッカーID は、空では無いかどうか

  • パッケージID と スティッカーID は、半角数字かどうか

  • 画像ID は、空では無いかどうか

  • 画像は、Googleドライブ内に存在するかどうか

など、入力内容に問題がないかどうかチェックしています。

コード内の … の部分は各種のエラー処理です。
見やすさのために、今回は … にしましたが、提供しているスプレッドシートにはそれぞれのエラー出力用コードが記載されていますので、ご参照ください。

⬇️ 以下は使用しているクラス ⬇️

Googleドライブ内のファイルを取得する関数 (getFileById()) を使用する際に、try-catch で囲んでいます。
これは、getFileById() 関数で検索した 画像ID が存在しない場合、例外をスローするためです。
例外がスローされてもエラーで落ちないようにしています。

LINE への送信

// リクエストデータ
let options =
{
  "method" : method,
  "muteHttpExceptions" : true,
  "headers" : {
   "Authorization": "Bearer "+this.token,
    "Content-Type" : "application/x-www-form-urlencoded"
  },
};

// 取得情報を保存
const response = UrlFetchApp.fetch(this.base+url,options);

LINE へは、外部サービスにリクエストを送るための関数 UrlFetchApp.fetch()関数を使用します。

⬇️ 以下は使用しているクラス ⬇️

LINE側でどのようにリクエストを送信して欲しいか、といったルールが決められていますので、それに従って送信します。

⬇️ LINE Notify のドキュメント ⬇️

送信が完了すると、response に HTTPレスポンスステータスコードが返ります。

HTTPレスポンスステータスコードとは、HTTPリクエスト が正常に完了したかどうかを示すステータスコードです。

⬇️ 詳しくは以下をご参照ください。⬇️

どのようなステータスコードを返すかも、LINE Notify ドキュメントに記載されていますので、ご確認ください。

⬇️ 通知の際のレスポンスステータスコード例 ⬇️

レスポンスステータスコード

LINE Notify に限らず、"200" が返ってくれば OK です。

メニューの作成

// UIオブジェクトの取得
const ui = SpreadsheetApp.getUi();
// メニューの作成
let menu = ui.createMenu(list["menuName"]);
// アイテムの追加
menu = menu.addItem("メッセージ送信","sendMessage");
// UIオブジェクトにメニューを設定
menu.addToUi();

様々な機能を GAS で追加していますので、それらを使用するために独自メニューを追加しています。

⬇️ 以下は使用しているクラス ⬇️


サポート窓口

プログラミングのこと、実現方法(仕様や実装)のこと、あなたの実現したいこと、など困ったことがあれば、LINE公式アカウントにて質問してください。

サポートさせて頂きます。

⬇️LINE公式アカウントに登録してご連絡ください⬇️


IT や マーケティング でお悩みの方は
ぜひこの機会に LINE に登録して
【無料】個別相談 にお申込みください✨

もし「サポートしたい!」という方がいらっしゃいましたら、ぜひぜひサポートをお願いいたします! 開発費や外注費などクリエイター活動の一部として使用させて頂きます✨