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

ご覧頂きまして、誠にありがとうございます。
写真スライドショーが作れる動画編集ソフトを使って、YouTubeTikTokThreadsにUPしてます。

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

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

※ 音量注意 ※

●YouTube

● TikTok



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

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

ゴンドラからの景色

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

ツリーもおしゃれ


OLYMPUS DIGITAL CAMERA

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

グッジョ!!

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

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

メリークリスマス!!

今日も見て下さって、ありがとうございました (=^x^=)

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

TikTok始めました。
始めた理由は、TikTokの仕組みに興味を持ったからです。若い方限定のSNSなので、自分には無理だと思っていたのですが、他のSNSが時間に影響を受ける仕組みに対してTikTokは時間に影響を受けないループ型なので、良い動画であれば過去の動画も見て頂けるという仕組みに興味を持って始めました。TikTokは、Twitterが使える方なら多分すぐ慣れると思いますし、動画編集に至っては、YouTubeの100倍以上楽です。

インスタ再開しました。

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

■ 関連記事 ■

自己紹介


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

初めてのPhotoshop

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サンプル
基本情報技術者試験

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

モバイルバージョンを終了