よみうりランドのジュエルミネーションXmasイルミネーション

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

東京都稲城市にあるよみうりランド。
京王よみうりランド駅からゴンドラで数分で到着。
その、ゴンドラからの眺めも絶景です。

写真をスライドショー編集ソフトやフリー素材BGMを使って動画を作っています。

※音量注意※

● YouTube

● TikTok



動画内の写真やそれ以外の写真もこのブログには掲載します。

京王線の京王よみうりランド駅が夢の世界の入り口。

ゴンドラからの景色

噴水のイルミネーションはど迫力!!

ツリーもおしゃれ


OLYMPUS DIGITAL CAMERA

クールなイルミネーションに・・・

グッジョ!!

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

鉛筆工場(??)のイルミネーションもキュート!!

メリークリスマス!!

今日も見て下さってありがとうございます。

TikTok始めました。
若い人限定のSNSだから自分には無理だと思っていたのですが、応援している女優さんの馬場ふみかさんが出演されるドラマMBSドラマ特区「恋と弾丸」の情報収集のために始めてみました。Twitterが使える人なら多分すぐ慣れると思いますし、動画編集に至っては、YouTubeの100倍以上楽です。

インスタ再開しました。

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

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

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

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

GASで「ねこあつめ」ChatworkのAPIトークンをプロパティストアに格納して使う「ねこあつめシリーズその13」

この記事では、GAS(Google Apps Script)で「ねこあつめ」を一定時間間隔にChatworkに送信した時に使ったAPIトークンをプロパティストアと言うもので管理して、別領域に格納することを実践致します。
お世話になった記事は、いつも隣にITのお仕事さんの

【初心者向けGAS】プロパティストアの概要とスクリプトプロパティの入力方法

と、

【初心者向けGAS】スクリプトプロパティを操作してそのデータを取り出す方法

です。

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

1分置きにねこあつめの猫ちゃんの名前を送る「トリガー」を使いました。エディターの「目覚まし時計マーク」を押して、トリガーを設定しました。

Chatworkに実際に送られたメッセージです。

このメッセージの元になっているのが、下記のスプレッドシートで、これらのコードはこのスプレッドシートにバインドして書いていっています。

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

さて、今回の内容に入ります。今まで、Chatworkに送る時に、

token:’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’の所に、ChatworkのマイチャットのAPIトークンをそのまま打っていました。

この’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’の所を別の領域に格納する為に、「プロパティストア」を使います。

‘XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’の代わりに例えば’CW_TOKEN’などの文字列を使って処理を施すことが可能になります。

そうすることによって、APIトークンをネットで晒すことを防げます。

//ChatworkのAPIトークンをCW_TOKENに格納
function setScriptPropaty(){
  PropertiesService.getScriptProperties().setProperty('CW_TOKEN','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}

このコードで、’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’を’CW_TOKEN’として扱うことが出来ます。

実行結果は、このように、何も実行されていません。

確認のため、下記のコードで’CW_TOKEN’に’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’が格納されていることがログ出力致します。

//プロパティストアを使ってCW_TOKENにAPIトークンが格納されたことを確認する
function logToken(){
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');
  console.log(token);  
}

この、モザイクの所に、APIトークンが入っています。

では、今まで作ってきたこのコードに修正を致します。
これまでのコードです。

//メインの関数で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);
}

4行目の「let lastRow = ss.getLastRow();//最終行を取得」の後に

const token = PropertiesService.getScriptProperties().getProperty(‘CW_TOKEN’);

を加えます。最後の’CW_TOKEN’の所に’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’が入っています。

それらを定数tokenに代入しています。

宅配業者のようなsendMeessageの呼び出しの所に、bodyの前にtokenを加えて、呼び出した先の仮引数にも加えています。
メイン関数の引数を、「DVDを渡すもの」だとしたら、宅配業者の様なsendMessage関数の仮引数は「DVDを受け取るもの」というイメージだとプログラムの流れが掴みやすいと思います。

また、29行目の所の’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’を「token」で置き換えています。

下記のコードで、追記変更した所に「←コメント」を追加しています。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  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(token,body); //←ここに引数tokenを追加する
      ss.getRange(i, 4).setValue('済');

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

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){  //←ここの引数にtokenを加える
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

APIトークンの’XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX’を晒すこと無く、今までと同様に動作します。

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 3 2 で何回割れる?」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでwhileループを使って、2で何回割ることが出来るのか回数を数える方法が学べます。

どちらのコードでも割り算の過程や変数の値の変化を追いやすい様に、トレースのコードを設けています。

ループの最初にIF文で割り切れない(余りが0ではない)場合はbreakでループを抜けるようにしています。

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

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

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

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

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

2 で何回割れる? (paizaランク D 相当)

問題:
整数 N が与えられます。
N が何回 2 で割れるかを求め、出力してください。

この記事では、下記の入力例3の場合にリストの個数N=10として10が2で何回で割れるかを求めます。

入力例3
10

出力例3
1

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

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

■ Pythonでの解き方 ■

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

手順として、

1:数値N「10」を取得する

2:割り算を実行する処理の回数をcountで求めるので、count変数を0で初期化しています。

3:whileループでNが2以上という条件を満たす間、ループを回します。
2で割っていくのに1.999などの数ですと、割り切ることが出来ないからです。

4:ループの最初にNが2で割り切れない場合は、breakでループを抜けるよう設定しています。
10を2で割ると5、5を2で割ると2.5で、2以上という条件を満たしていますが、除算は実行出来ても割り切れてはいないので、計算を終了するためにループを抜けます。

5:割り算を実行します。

6:countをインクリメントします。

7:countを表示します。

で、行います。

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

#整数Nを取得
N=int(input())


#何回で割れるかを求めるcount変数を0で初期化
count=0

print('<<<ループに入ります。>>>')

#ループで除算
while(N>=2):
    print('除算前のNの値:'+str(N))
    
    #2で割った時に余りが出る場合はループを抜ける
    if N%2!=0:
        break
    #除算実行
    N/=2
    print('除算後のNの値:'+str(N))
    
    #除算回数をカウントする
    count+=1
    print('割った回数は【'+str(count)+'】回です。')
    print('----------------------')

print('<<<ループを抜けました。>>>')

print(count)  

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

#整数Nを取得
N=int(input())


#何回で割れるかを求めるcount変数を0で初期化
count=0

#print('<<<ループに入ります。>>>')

#ループで除算
while(N>=2):
    #print('除算前のNの値:'+str(N))
    
    #2で割った時に余りが出る場合はループを抜ける
    if N%2!=0:
        break
    #除算実行
    N/=2
    #print('除算後のNの値:'+str(N))
    
    #除算回数をカウントする
    count+=1
    #print('割った回数は【'+str(count)+'】回です。')
    #print('----------------------')

#print('<<<ループを抜けました。>>>')

print(count)    

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

#整数Nを取得
N=int(input())


#何回で割れるかを求めるcount変数を0で初期化
count=0

#ループで除算
while(N>=2):

    #2で割った時に余りが出る場合はループを抜ける
    if N%2!=0:
        break
    #除算実行
    N/=2
    #print('除算後のNの値:'+str(N))
    
    #除算回数をカウントする
    count+=1

print(count)   

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの黄色いセルの所に「2で割り切れた回数」を出力します。
割り切れた回数は変数countに格納します。
また、countを二次元配列count2に追加して、スプレッドシートに出力します。

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

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

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

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


3:割り切れた回数を格納する変数countを宣言する


4:whileループでNが2以上という条件を満たす時にループを回す。
また、IF文でNを2で割り切れない(N%2が0では無い)時にループを抜ける。
除算を実行して、割り切れた回数のcountをインクリメントする。


5:スプレッドシートに出力する二次元配列配列count2を宣言する


6:countをcount2に二次元配列として追加する


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


8:スプレッドシートの黄色いセルに割り切れた回数が格納された二次元配列count2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

let N=ss.getRange(1,2).getValue();

※Nを割っていくので、Nの値が変わる、すなわち変数なので定数のconstではなく変数のletで宣言をします※

手順3:割り切れた回数を格納する変数countを宣言する

let count=0;

手順4:
whileループでNが2以上という条件を満たす時にループを回す。
また、IF文で、Nを2で割り切れない(N%2が0では無い)時にループを抜ける。
除算を実行して、割り切れた回数のcountをインクリメントする。

文字と数値を同時に表示する場合は、console.logの中に「 ` 」(shift+@)で括り、数値は${}を使います。

console.log('<<<ループに入ります。>>>')
while(N>=2){

  console.log(`割り算を実行する前のNの値:${N}`);
  console.log(`割り算を実行する前のcountの値:【${count}回】`);

  if(N%2!=0){
    break;
  }

  N/=2;

  console.log(`割り算を実行した後のNの値:${N}`);

  //除算を実行して、割り切れた回数のcountをインクリメントする
  count++;
  console.log(`割り算を実行した後のcountの値:【${count}回】`);

  console.log('---------------------------------------');

}

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

手順5:スプレッドシートに出力する二次元配列配列count2を宣言する

let count2=[];

手順6:countをcount2に二次元配列として追加する

count2.push([count]);

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

console.log(count2);

手順8:スプレッドシートの黄色いセルに掛け算の計算結果が格納された二次元配列count2を出力する

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

function loop2no8(){

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

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

//割り切れた回数を格納する変数countを宣言する
let count=0;

//whileループでNが2以上という条件を満たす時にループを回す。
//また、IF文でNを2で割り切れない(N%2が0では無い)時にループを抜ける。

console.log('<<<ループに入ります。>>>')
while(N>=2){

  console.log(`割り算を実行する前のNの値:${N}`);
  console.log(`割り算を実行する前のcountの値:【${count}回】`);

  if(N%2!=0){
    break;
  }

  N/=2;

  console.log(`割り算を実行した後のNの値:${N}`);

  //除算を実行して、割り切れた回数のcountをインクリメントする
  count++;
  console.log(`割り算を実行した後のcountの値:【${count}回】`);

  console.log('---------------------------------------');

}

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


//スプレッドシートに出力する二次元配列配列count2を宣言する
let count2=[];

//countをcount2に二次元配列として追加する
count2.push([count]);

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

//スプレッドシートの黄色いセルに割り切れた回数が格納された二次元配列count2を出力する
ss.getRange(4,1).setValue(count2);

}

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

よみうりランドジュエルミネーション。
2019年12月、コロナ前に撮影

■ 参考文献の紹介■

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

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

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

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

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

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