グリーンエクササイズ、新緑の水元公園へ自転車でGo!!

この記事では、東京都葛飾区にある都立公園、水元公園でのサイクリングの写真動画を掲載しています。
この写真は【コロナより前】2018年4月のGW、ゴールデンウィークに撮影しています。

※音量注意※

まず、水元公園の場所を確認します。

ここです。

まぁ、東京都の右上あたりってことでざっくりと。
この写真動画の中から何枚か紹介します。

ゴールデンウィークの爽やかな風、太陽、水辺、サイクリングでグリーンエクササイズを堪能して来ました。

息抜きに、写真で癒し(=^x^=)に戻る
自己紹介

ストレス解消グッズ
心がラクになる本
発達障害と健康の本
何の本を読んだら良いのか分からない時に読む本

インスタ再開しました。

写真スライドショーが作れる動画編集ソフトを使って、YouTubeにUPしてます。

写真の投稿を始めました。
(写真AC)のプロフィールページです。

写真のアンケートを実施しております。
宜しかったらご回答頂けますと、大変励みになります(=^x^=)

GASで「トリガー」を使って、1分おきに「ねこあつめ」の名前を時限式に「Chatwork」に送る(=^x^=)mm「ねこあつめシリーズその12」

この記事では、GAS(Google Apps Script)で「トリガー」を使って、ねこあつめを一定時間間隔にChatworkに送信します。
お世話になった記事は、いつも隣にITのお仕事さんの

【初心者向けGAS】時限式のイベントトリガーを設置して決まった時刻にBotを送信する方法

です。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

今回の内容に入る前に、前回の復習をします。

このスプレッドシートの赤枠が空欄になっている猫ちゃんの名前(A列)を1匹ずつ変数bodyに格納して、Chatworkに送信する関数「sendMessage」を呼び出し、Chatworkに出力した後に、スプレッドシートの赤枠に「済」をつける流れになっています。

全ての猫ちゃんの名前をChatworkに出力したら、「済」を全部消して再度同様の処理が出来る様になっていま
す。

前回のコードです。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {

      //AmazonがDVDの注文を受け取る
      const body=ss.getRange(i, 1).getValue();

      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(body){
  const cw=ChatWorkClient.factory({token:'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'});
  cw.sendMessageToMyChat(body);
}

今回の内容に入る前に、ねこあつめ画像で癒されました。

前回は手動で1つ1つチャットワークに送っていましたが、今回はGASの「トリガー」を用いて定期的に送るようにいたします。

エディター画面の左側の四角の目覚まし時計マークをクリックします。

右下の「トリガーを追加」を押下します。

左側の赤枠の設定をします。

イベントのソースを選択を「時間主導型」に、
時間ベースのトリガータイプを選択を「分ベースのタイマー」に、
時間の間隔を設定(分)を「1分おき」に設定します。

右下の「トリーガーの保存」を押下します。

トリガーがこの様に追加されました。

これで1分ごとに猫ちゃんの名前がチャットワークに送られてきます。

このままですとずっと送られてきてしまうので、下の図の3点リーダーからトリガーを削除します。

「トリガーを削除」を選択します。

「完全に削除」を選択します。

ここまでご精読ありがとうございました。

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃん    次行くにゃん(=^x^=)→

paiza レベルアップ問題集 「STEP: 1 各桁の和」をPythonとGASで解いてみた

この記事を読むことで、Python・GASで整数を標準入力で文字列として取得し、その長さを求め、ループで整数の変換しながら合計を求める方法で、特にループの所で変数の動きが分かりやすいようにトレースをしています。

整数の桁数を求める方法や、文字列を数値に変換する方法について、Python・GASの両方のコードで詳しく書いています。

以上がPythonとGASの両方のコードで習得することが可能になります。
最初にPython、次にGASのコードを掲載します。

このコーナーでは、学習コンテンツpaizaラーニングレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。

GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。

サイトマップはこちらから

paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験

paizaでの解答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。

各桁の和 (paizaランク D 相当)

問題:
10 進数で表された整数 N が与えられます。
整数 N の各桁の和を計算し、出力してください。

この記事では、下記の入力例3の場合に整数をNとして「813」が与えられ、その各桁の和・8+1+3=12を求めるプログラミングの問題を解いて行きます。

入力例3
813

出力例3
12

ではまず、Pythonで解いてみます。

今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。

■ Pythonでの解き方 ■

下準備として、paiza.ioにこの様に入力します。
(入力例3をそのままioにコピーしただけ。)

手順として、

1:標準入力で数値Nを「文字列として」取得

2:数値Nの桁数を求める


3:合計値ansを0で初期化


4:ForループとIFで格桁ごとに数値に変換して合計を求める


5:その合計を出力

で、行います。

まずは、プログラムの動きを見やすいように、トレースのコードとトレースのio出力結果を添えます。


#数値Nを文字列として取得
N=input()

#Nの桁数(文字列の長さ)を求める
length=len(N)

#合計結果ansを0で初期化
ans=0

#この文字列をリストとして、各桁を数値に変換して足していく
for i in range(length):
    print('現在の合計値ans:【'+str(ans)+'】')
    num=int(N[i])#ここで数値に変換している
    print(str(i+1)+'桁目の数は「'+str(num)+'」です。')
    print('現在の合計値ansに「'+str(num)+'」を加えます')
    ans+=num#合計値を加算演算子で計算
    print('計算後のans:【'+str(ans)+'】')
    print('------------------------')
    
#合計値を出力する
print(ans)

トレースコードのログです。

このままでは、出力例3の合計値ans:12に対して冗長なコードが含まれているので、解答以外のprint文をコメントアウトします。


#数値Nを文字列として取得
N=input()

#Nの桁数(文字列の長さ)を求める
length=len(N)

#合計結果ansを0で初期化
ans=0

#この文字列をリストとして、各桁を数値に変換して足していく
for i in range(length):
    #print('現在の合計値ans:【'+str(ans)+'】')
    num=int(N[i])#ここで数値に変換している
    #print(str(i+1)+'桁目の数は「'+str(num)+'」です。')
    #print('現在の合計値ansに「'+str(num)+'」を加えます')
    ans+=num#合計値を加算演算子で計算
    #print('計算後のans:【'+str(ans)+'】')
    #print('------------------------')
    
#合計値を出力する
print(ans)

スッキリするように、コメントアウトした部分を省いたコードです。

#数値Nを文字列として取得
N=input()

#Nの桁数(文字列の長さ)を求める
length=len(N)

#合計結果ansを0で初期化
ans=0

#この文字列をリストとして、各桁を数値に変換して足していく
for i in range(length):
    num=int(N[i])#ここで数値に変換している
    ans+=num#合計値を加算演算子で計算
    
#合計値を出力する
print(ans)

ioの出力結果です。

■ GASでの解き方 ■

では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。

緑のセルに整数が入力されています。
黄色いセルの所に「各桁の合計値」を出力します。

※スプレッドシートに表示する場合は、ループを使って一次元配列ではなく、二次元配列としてからの配列に追加をして作成します※

手順はこのようになります。

1:スプレッドシートからアクティブシートをアクセスする

2:スプレッドシートの緑色のセルから整数N(この例では「813」)を取得する


3:整数Nが取得できたことをログで確認


4:変数Lenに、整数Nの桁数を取得して代入する


5:桁数Lenが取得できたことをログで確認する


6:合計値として計算に使用する変数ansを0で初期化する


7:ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する

8:ansの合計結果をログ出力で確認

9:スプレッドシードに2次元配列として出力するans2を宣言

10:ansをans2にpushメソッドで追加する

11:スプレッドシート出力前に二次元配列ans2のログ出力で確認する

12:スプレッドシートの黄色いセルに格桁の合計が格納された二次元配列ans2を出力する

手順1: スプレッドシートからアクティブシートをアクセスする

const ss=SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

手順2: スプレッドシートの緑色のセルから整数N(この例では「813」)を取得する

const N = ss.getRange(1, 2).getValues();

手順3:ログで整数Nが取得できたことをログで確認

console.log(N);

手順4:整数Nの桁数を取得して、変数Lenに代入する

const Len = N.toString().length;

toStringは、整数Nの桁数を調べる為に一旦文字列にしてからlengthを使って桁数を調べます。
これはSAMURAI ENGINEERさんのtoStringメソッドの使い方の記事が分かりやすいです。

手順5:桁数Lenが取得できたことをログで確認する

console.log(`この数字列の桁数は、【${Len}】桁です。`);

文字列と数値を一緒に表示させるには、Shiftキーと@を押して「`」で囲って、${}のなかに数値を入れます。

手順6:合計値として計算に使用する変数ansを0で初期化する

let ans = 0;

計算の合計に使う値に何か入っていると正確な計算が出来ないので、必ず0で初期化します。

手順7:ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する。

sliceメソッドで文字列を切り出す場合、この場合は

let num = N.toString().slice(i, i + 1);

と書いています。

slice(開始位置,終了位置の手前)

になるので、終了位置に+1としています。

この説明も、SAMURAI ENGINEERさんの文字列の任意の範囲を切り抜く方法の記事が分かりやすいです。

切り取った文字を数値に変換させています。

num=Number(num);

今回は、iを0からLen(長さ3)未満の範囲、つまりi=0,1,2でループを回しましたので、そのトレースを行います。

i=0の時

let num = N.toString().slice(0,1);

で、numに0番目の文字「8」が入り、合計が【8】になりました。

i=1の時

let num = N.toString().slice(1,2);

で、numに1番目の文字「1」が入り、合計が【9】になりました。

i=2の時

let num = N.toString().slice(2,3);

で、numに2番目の文字「3」が入り、合計が【12】になりました。

では、ループの部分とその前後のコードです。

//ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する
  console.log('<<<ループに入ります!!>>>');

  for (let i = 0; i < Len; i++) {
    let num = N.toString().slice(i, i + 1);
    console.log(`現在の合計値ans:【${ans}】`);
    num=Number(num);
    console.log(`文字列「${i}」番目は「${num}」です。`);
    ans += num;  //ここで加算演算子を使ってansに加えている
    console.log(`「${num}」を加えた合計ansは【${ans}】になりました`);
    console.log('---------------------------------');
  }

  console.log('<<<ループを抜けました。>>>');

手順8:ansの合計結果をログ出力で確認

console.log(ans);

手順9:スプレッドシードに2次元配列として出力するans2を宣言

ans2=[];

手順10:ansをans2にpushメソッドで追加する

ans2.push([ans]);

手順11:スプレッドシート出力前に二次元配列ans2のログ出力で確認する

console.log(ans2);

手順12:スプレッドシートの黄色いセルに格桁の合計が格納された二次元配列ans2を出力する

ss.getRange(3,2).setValue(ans2);

GASでの全コードはこちらになります。

function loop2no6() {

  //スプレッドシートからアクティブシートをアクセスする
  const ss = SpreadsheetApp.getActiveSheet();

  //スプレッドシートの緑色のセルから整数N(この例では「813」)を取得する
  const N = ss.getRange(1, 2).getValues();

  //整数Nが取得できたことをログで確認
  console.log(N);

  //変数Lenに、整数Nの桁数を取得して代入する
  const Len = N.toString().length;

  //桁数Lenが取得できたことをログで確認する
  console.log(`この数字列の桁数は、【${Len}】桁です。`);

  //合計値として計算に使用する変数ansを0で初期化する
  let ans = 0;


  //ForループとIF文でsliceメソッドを使って数字列Nから各桁を切り出して、数値に変換してansに加算演算子で加算する
  console.log('<<<ループに入ります!!>>>');

  for (let i = 0; i < Len; i++) {
    let num = N.toString().slice(i, i + 1);
    console.log(`現在の合計値ans:【${ans}】`);
    num = Number(num);
    console.log(`文字列「${i}」番目は「${num}」です。`);
    ans += num;  //ここで加算演算子を使ってansに加えている
    console.log(`「${num}」を加えた合計ansは【${ans}】になりました`);
    console.log('---------------------------------');
  }

  console.log('<<<ループを抜けました。>>>');


  //ansの合計結果をログ出力で確認
  console.log(ans);

  //スプレッドシードに2次元配列として出力するans2を宣言
  ans2 = [];

  //ansをans2にpushメソッドで追加する
  ans2.push([ans]);


  //スプレッドシート出力前に二次元配列ans2のログ出力で確認する
  console.log(ans2);

  //スプレッドシートの黄色いセルに格桁の合計が格納された二次元配列ans2を出力する
  ss.getRange(3, 2).setValue(ans2);

}

宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。

石神井公園の桜。サイクルボートに乗って撮影しました。

■ 参考文献の紹介■

じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。

初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。

サイトマップはこちらから

paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験

←前の問題へ          次の問題へ→