みなとみらい、横浜ランドマークタワーのクリスマスイルミネーション

この記事では、横浜みなとみらいの夜景の動画と写真を掲載します。

横浜ランドマークや、よこはまコスモワールドの大観覧車、港やヨコハマ グランド インターコンチネンタル ホテルの白い帆の外観を望みます。

※ 音量注意!! ※

横浜ランドマークタワーからの眺め。

港町の灯台

横浜のクリスマス

よこはまコスモワールドの大観覧車

ヨコハマ グランド インターコンチネンタル ホテル

◆夜景部門第1位(自身のTwitterで投票を実施)
横浜ランドマークタワー、みなとみらいの夜景、エレベーター内

このブログのアクセスは、私の地元東京下町以上に、横浜の方のアクセス数が多いです。横浜の方も、地元が近い方も、他の地域の皆様も、いつもありがとうございます。


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

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

インスタ再開しました。

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

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

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

【Python2重ループ】二重ループと論理積and、論理和orで、オリンピックイヤーの市松模様

この記事は、Pythonの二重ループを学習中で、規則的で簡単なドット絵を描きたい方を対象にしています。

題材はオリンピックで話題になった、市松模様です。

今日は2021年12月31日の大晦日、もうすぐオリンピックイヤーも終わります。
そこで、今年の締めのプログラミングとして、Pythonで二重ループを使って、市松模様を作りました。

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

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

ここでは最初にリスト(配列)の全ての要素に「□」で埋めます。
10行20列の□を取り出すには、リストarrayを行ごとに取り出す変数line、lineからドットごとに取り出す変数dotを使った二重ループで、内ループの所で改行することによって、次の行に行く前に改行が出来ています。

#市松模様の□を格納
array=[['□' for i in range(20)] for j in range(10)]

#ドット絵の取り出し
for line in array:
    for dot in line:
        print(dot,end="")
    print()    

では、これを一つ置きに「■」に置き換えてみます。
リストは0行0列から始まります。
このリストarrryは1番最初がarray[0][0]、1番最後がarray[9][19]です。
そこで、一つ置きになるように、「2で割り切れる行、且つ2で割り切れる列」または「2で割ると1余る行、且つ2で割ると1余る列」を「■」にします。

#市松模様の□を格納
array=[['□' for i in range(20)] for j in range(10)]



#市松模様の1つ置きに■を格納(i,j共に偶数・i,j共に奇数の時に■)
for i in range(len(array)):
    for j in range(len(array[0])):
        if (i%2==0 and j%2==0) or (i%2==1 and j%2==1):
            array[i][j]='■'
         

#ドット絵の取り出し
for line in array:
    for dot in line:
        print(dot,end="")
    print()    

2021年(令和3年)東京オリンピックで特に印象に残っているのは、スケボー女子の西矢椛選手の真夏の大冒険と飛び込みの玉井陸斗選手です。

読者さまのご覧になる時期によっては季節外れになってしまうかも知れませんが、良いお年をお迎え下さい。

最後までお読み頂きありがとにゃん(=^x^=)

■ 参考文献の紹介 ■
じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。

Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。

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

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

プログラミングのアンケートにご協力頂ける方はこちらのフォームで勉強法など色々と教えて下さい。

GASで「ねこあつめ」のコードにドキュメンテーションコメントを追加する「ねこあつめシリーズその16(最終回)」

この記事では、GAS(Google Apps Script)で「ねこあつめ」をChatworkに送信する為に今まで書いてきたコードに、ドキュメンテーションコメントを追加します。

お世話になった記事は、いつも隣にITのお仕事さん

【初心者向けGAS】Google Apps Scriptのドキュメンテーションコメントの書き方

です。

今回の内容に入る前に、前回の復習をします。
前回はスプレッドシートの猫ちゃんの「なまえ」〜「とくちょう」をChatworkに送る時にメッセージを装飾しました。

Chatworkに送るスプレッドシートです。

実際に送った画像です。

前回のコードです。

//メインの関数で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()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body='[info]';  //←ここで、囲い枠線で装飾する
      body+=cat[0][0]+'[hr]';//←A列:猫ちゃんの「なまえ」に水平線を入れる
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+='('+cat[0][2]+')[/info]';//←C列:猫ちゃんの「とくちょう」を送ったら囲い枠線を閉じる
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

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

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

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

雪の日のねこあつめ

さて、今回の内容に入ります。

今まで作ってきたコードの関数を、後で見返したり、誰かにコードを見てもらう時に分かりやすくする為に、ドキュメンテーションコメントという、関数を説明する為のコメントを書いて行きます。

ドキュメンテーションコメントは「/」で始まって「*/」で終わります。

引数を@param、戻り値を@returnとして、型を指定します。
今回のコードの32行目〜38行目までドキュメンテーションコメントが入っています。

//メインの関数で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()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body='[info]';  //ここで、囲い枠線で装飾する
      body+=cat[0][0]+'[hr]';//A列:猫ちゃんの「なまえ」に水平線を入れる
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+='('+cat[0][2]+')[/info]';//C列:猫ちゃんの「とくちょう」を送ったら囲い枠線を閉じる
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

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

/**
 * 
 * チャットワークのマイチャットにスプレッドシートの「ねこあつめ」のメッセージを送信する
 * 
 * @param{string} token - チャットワークAPIトークン
 * @param{string} body - スプレッドシートのチャットワークに送信するメッセージ本文
 */

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

今まで通り送れました。因みに今日は大晦日です。

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

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

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

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

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

←前に戻るにゃん

paiza レベルアップ問題集 「STEP: 6 10 進数から M 進数に変換」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASで10進数から任意の進数(M進数)に基数変換するコードの書き方を学べます。
whileループでMで割った余りをリスト(配列)に格納し、Pythonではスライスを使ってForループでリストの逆順から表示させます。

別解として2進数に変換した結果を数値に格納するコードも記述しました。
GASではこの別解に基づいてコードを書いています。

基本的なループの書き方にスライスを使った書き方、剰余演算子、リスト(配列の追加)など、プログラミングの基幹となる文法の習得を強化できます。

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

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

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

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

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

10 進数から M 進数に変換 (paizaランク C 相当)

問題:
10 進数で表された整数 N, M が与えられます。
N を M 進数に変換して出力してください。

この記事では、下記の入力例2の場合に、10進数N=10と基数変換するM進数M=8が与えられた時に、8進数でどのような計算結果になるのかを求めて行きます。

入力例2
10 8

出力例2
12

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

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

■ Pythonでの解き方 ■

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

手順として、

1:10進数の数値N=10とM進数のM=8を取得する

2:余りを格納する整数arrayを宣言する


3:whileループでN>=1の間、Mで割り続けて余りをarrayに格納する


4:Forループでスライスを使ってarrayを逆順に取り出す

で、行います。

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

10進数の10を8進数に変換すると12になり、計算過程はこちらの画像をご覧下さい。

この計算をwhileループを使って行います。
では、Whileループのトレースをします。

1回目の除算

2回目の除算

以上を踏まえて、トレースの部分を表示したコードを掲載します。

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

print('<<<ループに入る>>>')

while N>=1:
    print('除算実行前のNの値:'+str(N))
    print('除算実行前のリストarray:'+str(array))
    
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #リストに格納する余り
    print('リストに追加した余り【'+str(N%M)+'】')
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)
    print('除算実行後のNの値:'+str(N))
    print('除算実行後のリストarray:'+str(array))
    
    print('-----------------------')
    

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


#リストを表示
print(array)
    
#リストを逆順から取り出す
for num in array[::-1]:
    print(num,end="")

print()    

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

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

#print('<<<ループに入る>>>')

while N>=1:
    #print('除算実行前のNの値:'+str(N))
    #print('除算実行前のリストarray:'+str(array))
    
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #リストに格納する余り
    #print('リストに追加した余り【'+str(N%M)+'】')
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)
    #print('除算実行後のNの値:'+str(N))
    #print('除算実行後のリストarray:'+str(array))
    
    #print('-----------------------')
    

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


#リストを表示
#print(array)
    
#リストを逆順から取り出す
for num in array[::-1]:
    print(num,end="")

print()  

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

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

while N>=1:
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)


#リストを逆順から取り出す
for num in array[::-1]:
    print(num,end="")

print()  

ioの出力結果です。

上の書き方ではスライスを使ってリストをForループで逆から取り出していましたが、リストを反転させて、[1,2]を12と表記させる方法のコードを掲載します。

別解のコードでは、Forループのトレースと、コメントアウトをしたコード、コメントアウトを取り除いたコードを掲載します。

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

while N>=1:
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)

#リストを反転させる
print(array)
array=list(reversed(array))
print(array)


#8進数を格納する変数ansを0で初期化
ans=0

print()

#リストの数値を元に計算結果をansに格納

print('<<<Forループに入る>>>')

for num in array:
    print('計算前のansの値:'+str(ans))
    ans*=10
    print('10倍したansの値:'+str(ans))
    print(str(ans)+'に'+str(num)+'を加える')
    ans+=num
    print('計算後のansの値'+str(ans))
    print('-----------------')

print('<<<Forループを抜けた>>>')

print()

print(ans)

For文に入る前に、リストを反転させます。

では、For文のループでの変数の動きを見て行きます。

1回目のansの計算

2回目のansの計算

このコードを出力形式に合わせてコメントアウトしたコードです。

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

while N>=1:
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)

#リストを反転させる
#print(array)
array=list(reversed(array))
#print(array)


#8進数を格納する変数ansを0で初期化
ans=0

#print()

#リストの数値を元に計算結果をansに格納

#print('<<<Forループに入る>>>')

for num in array:
    #print('計算前のansの値:'+str(ans))
    ans*=10
    #print('10倍したansの値:'+str(ans))
    #print(str(ans)+'に'+str(num)+'を加える')
    ans+=num
    #print('計算後のansの値'+str(ans))
    #print('-----------------')

#print('<<<Forループを抜けた>>>')

#print()

print(ans)

更に、コメント部分を取り除いた、スッキリとしたコードです。

#10進数の整数NとM進数のMを取得
N,M=map(int,input().rstrip().split(' '))

#余りを格納するリストを宣言
array=[]


#NがM以上の場合に除算を繰り返して余りをリストに格納する

while N>=1:
    #NをMで除算して、余りをarrayに格納する
    array.append(N%M)
    #除算してNを更新する
    N/=M
    #Nを整数にする
    N=int(N)

#リストを反転させる
array=list(reversed(array))

#8進数を格納する変数ansを0で初期化
ans=0

for num in array:
    ans*=10
    ans+=num
    
print(ans)

別解でも無事正解しました。

■ GASでの解き方 ■

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

スプレッドシートの黄色いセルの所に「10進数N(=10)をM(=8)進数に基数変換をした結果12」を出力します。

基数変換の計算結果はansに格納します。
また、ansを二次元配列ans2に追加して、スプレッドシートに出力します。

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

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

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

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


3:スプレッドシートの灰色のセルからM進数のM(この例では「8」)を取得する


4:8で割った余りを格納する配列を宣言する


5:whileループを使って余りを配列に格納する


6:配列を表示


7:配列を反転させる


8:反転した配列を表示


9:M進数を変数ansに格納する為、ansを0で初期化する


10:Forループで8進数を計算する


11:ansを表示


12:スプレッドシートに格納する二次元配列ans2を宣言


13:ansをans2に二次元配列として格納


14:スプレッドシートに出力前にans2を出力して確認する


15:スプレッドシートの黄色い所に8進数に基数変換した結果を格納する

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

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

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

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

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

手順4:2で割った余りを格納する配列を宣言する

let array=[]

手順5:whileループを使って余りを配列に格納する

1回目の除算

2回目の除算

whileループの部分のコードです。

//whileループを使って余りを配列に格納する
  console.log('<<<whileループに入りました>>>');
  

  while(N>=1){
    console.log(`計算前のNの値:${N}`);
    console.log(`計算前の配列array:[${array}]`);
    console.log(`配列に追加する余り【${N%M}】`);

    //配列に追加
    array.push(N%M);

    //割り算の実行
    N/=M;

    //Nを整数にする
    N=Math.floor(N);

    console.log(`計算後のNの値:${N}`);
    console.log(`計算後の配列array:[${array}]`);

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

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

手順6:配列を表示

console.log(array);

手順7:配列を反転させる

array=array.reverse();

手順8:反転した配列を表示

console.log(array);

配列を反転させる前と後の画像です。

手順9:2進数を変数ansに格納する為、ansを0で初期化する

let ans=0;

手順10:Forループでリストから2進数に基数変換する

1回目のansの計算

2回目のansの計算

Forループのコードです。

//Forループで8進数を計算する
console.log('<<<Forループに入りました>>>');

for(let i=0;i<=array.length-1;i++){
  
  //配列の値をansに計算する
  console.log(`計算前のansの値:${ans}`);
  ans*=10;
  console.log(`ansを10倍にした値:${ans}`);
  ans+=array[i];
  console.log(`計算後のansの値:${ans}`);

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

}

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

手順11:ansを表示

console.log(ans);

手順12:スプレッドシートに格納する二次元配列ans2を宣言

let ans2=[];

手順13:ansをans2に二次元配列として格納

ans2.push([ans]);

手順14:スプレッドシートに出力前にans2を出力して確認する

console.log(ans2);

手順15:スプレッドシートの黄色い所に8進数に基数変換した結果を格納する

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

実行した後のスプレッドシートです。

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

function loop2no11() {

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

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

  //スプレッドシートの灰色のセルからM進数のM(この例では「8」)を取得する
  const M = ss.getRange(2, 2).getValue();

  //8で割った余りを格納する配列を宣言する
  let array = [];


  //whileループを使って余りを配列に格納する
  console.log('<<<whileループに入りました>>>');


  while (N >= 1) {
    console.log(`計算前のNの値:${N}`);
    console.log(`計算前の配列array:[${array}]`);
    console.log(`配列に追加する余り【${N % M}】`);

    //配列に追加
    array.push(N % M);

    //割り算の実行
    N /= M;

    //Nを整数にする
    N = Math.floor(N);

    console.log(`計算後のNの値:${N}`);
    console.log(`計算後の配列array:[${array}]`);

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

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


  //配列を表示
  console.log(array);

  //配列を反転させる
  array = array.reverse();

  //反転した配列を表示
  console.log(array);

  //M進数を変数ansに格納する為、ansを0で初期化する
  let ans = 0;

  //Forループで8進数を計算する
  console.log('<<<Forループに入りました>>>');

  for (let i = 0; i <= array.length - 1; i++) {

    //配列の値をansに計算する
    console.log(`計算前のansの値:${ans}`);
    ans *= 10;
    console.log(`ansを10倍にした値:${ans}`);
    ans += array[i];
    console.log(`計算後のansの値:${ans}`);

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

  }

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

  //ansを表示
  console.log(ans);

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

  //ansをans2に二次元配列として格納
  ans2.push([ans]);

  //スプレッドシートに出力前にans2を出力して確認する
  console.log(ans2);

  //スプレッドシートの黄色い所に8進数に基数変換した結果を格納する
  ss.getRange(4, 2).setValue(ans2);

}

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

神奈川県川崎市、工場地帯の工場萌え写真。

■ 参考文献の紹介■

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

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

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

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

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

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

【Pythonループ】ループと論理和orで、「3時のヒロイン」登場!!

この記事は、Pythonのループを学習中で、「3時のヒロイン」さん(郷ひろみさんと一緒に「にしたんクリニック」のCMに出演している、吉本興業所属の芸人さん)をご存知の方、CMを見たことのある方を対象にしています。
電車でも広告を見かけます。

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

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

このCMですね。
「♪ た〜ん、たん、にしたん、たんたんた〜ん」
タンバリンを持って踊っている所が可愛いです。

Pythonでループを使って、3時と15時の時に3時のヒロインさんに登場して頂きます。

このループでは、range(24)で0時から23時まで表示させます。

論理和のorを使って、3時と15時の時にprint文を変えて3時のヒロインさんを登場させるだけのシンプルなループになっています。

print()

#3時と15時に「3時のヒロイン」を登場させる
for hour in range(24):
    if hour==3 or hour==15:
        print('\n\n<<<【'+str(hour)+'時】のヒロイン登場!!!>>>\n\n')
    else:
        print(str(hour)+'時')

print()

実行結果です。

3時のヒロインさんのプロフィールです。

最後までお読み頂きありがとにゃん(=^x^=)

■ 参考文献の紹介 ■
じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。

Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。

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

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

GASで「ねこあつめ」をChatworkにメッセージを装飾して送る「ねこあつめシリーズその15」

この記事では、GAS(Google Apps Script)で「ねこあつめ」をChatworkに送信する時に、メッセージを装飾して送る方法を掲載しています。

お世話になった記事は、いつも隣にITのお仕事さんの

【初心者向けGAS】チャットワークのメッセージ記法でBot送信するメッセージを装飾する方法

です。

今回の内容に入る前に、前回の復習をします。
前回はスプレッドシートの猫ちゃんの「なまえ」〜「とくちょう」までを配列として取得して、Chatworkに送ることによって、スプレッドシートのアクセス回数を格段に減らせました。

こちらのスプレッドシートです。

このスプレッドシートを元に、Chatworkに出力した画像とコードです。

//メインの関数で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()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body="";  //←ここで、bodyにA列、B列、C列のデータを追加していくので、bodyをletで変数として宣言
      body+=cat[0][0]+'\n';//A列:猫ちゃんの「なまえ」
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+=cat[0][2]+'\n';//C列:猫ちゃんの「とくちょう」
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

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

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

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

さて、今回の内容に入ります。

Chatworkにメッセージを送る際にタグを使って、メッセージを装飾します。
角カッコを使った、「メッセージ記法」という書き方を使ってコードを書いて行きます。

ここでは、メッセージを[info]というタグを使って囲い始め、水平の線を[HR]というタグで挿入して、丸カッコを使って体裁を整えて、[/info]で閉じます。

タグは、シングルクォーテーションで囲います。
「/」は、バックスラッシュではなく、普通のスラッシュです。

下記のコードで、14行目から17行目までにタグを入れてコメントを付けました。

//メインの関数で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()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body='[info]';  //←ここで、囲い枠線で装飾する
      body+=cat[0][0]+'[hr]';//←A列:猫ちゃんの「なまえ」に水平線を入れる
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+='('+cat[0][2]+')[/info]';//←C列:猫ちゃんの「とくちょう」を送ったら囲い枠線を閉じる
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

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

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

まずは1匹目の猫ちゃん、「ヘキサにゃん」

1匹目の「ヘキサにゃん」が「済」になりました。
他のコ達も送ってみました。

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

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

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

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

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

←前に戻るにゃん    次行くにゃん(=^x^=) <最終回>→

paiza レベルアップ問題集 「STEP: 5 10 進数から 2 進数に変換」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASで10進数から2進数に基数変換するコードの書き方を学べ、whileやForループの書き方、スライスを使った書き方、剰余演算子、リスト(配列の追加)など、プログラミングの基幹となる文法の習得を強化できます。

whileループで2で割った余りをリスト(配列)に格納し、Pythonではスライスを使ってForループでリストの逆順から表示させます。

別解として2進数に変換した計算結果をansという変数に格納するコードも記述しました。GASではこの別解に基づいてコードを書いています。

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

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

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

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

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

10 進数から 2 進数に変換 (paizaランク D 相当)

10 進数で表された整数 N が与えられます。
N を 2 進数に変換して出力してください。

この記事では、下記の入力例3の場合、10進数N=10が与えられた時に2進数でどのように変化していくかを求めて行きます。

入力例3
10

出力例3
1010

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

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

■ Pythonでの解き方 ■

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

手順として、

1:10進数の数値N=10を取得する

2:余りを格納する整数arrayを宣言する

3:whileループでN>=1の間、2で割り続けて余りをarrayに格納する

4:Forループでスライスを使ってarrayを逆順に取り出す

で、行います。

10進数を2進数に基数変換をする時は、下記のような2で割った余りを求めて、下から記述する方法で計算しました。
これは、10進数の10を2進数の「1010」に変換する時の計算過程です。

この図では、10を2で割った余りが「0」、5を2で割った余りが「1」、2を2で割った余りは「0」、最後1が残ります。
この余りを下から上に向かって「1010」と書くことで10進数の10を2進数の「1010」に変換出来ました。

この計算過程をwhileループを使って行います。
余りは配列arrayに順次追加して行きます。

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

1回目の除算

2回目の除算

3回目の除算

4回目の除算

余りを格納したリストをForループでスライスを使って逆から取り出しました。
以上を踏まえて、トレースのコードを掲載します。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

#whileループでN>=1の間、2で割り続けて余りをarrayに格納する

print('<<<ループに入る>>>')

while N>=1:
    print('除算前のリストarray:'+str(array))
    print('除算前のNの値:'+str(N))
    array.append(N%2)
    print('格納する余り:「'+str(N%2)+'」')
    
    N/=2
    N=int(N)
    print('除算後のNの値:'+str(N))
    print('除算後リストarray:'+str(array))
    print('------------------------')


print('<<<ループを抜ける>>>')    

#arrayを表示する
print(array)

#Forループを使って逆順から取り出す
for num in array[::-1]:
    print(num,end="")

#ループを抜けた所で改行をする
print()

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

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

#whileループでN>=1の間、2で割り続けて余りをarrayに格納する

#print('<<<ループに入る>>>')

while N>=1:
    #print('除算前のリストarray:'+str(array))
    #print('除算前のNの値:'+str(N))
    array.append(N%2)
    #print('格納する余り:「'+str(N%2)+'」')
    
    N/=2
    N=int(N)
    #print('除算後のNの値:'+str(N))
    #print('除算後リストarray:'+str(array))
    #print('------------------------')


#print('<<<ループを抜ける>>>')    

#arrayを表示する
#print(array)

#Forループを使って逆順から取り出す
for num in array[::-1]:
    print(num,end="")

#ループを抜けた所で改行をする
print()

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

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)

    N/=2
    N=int(N)

#Forループを使って逆順から取り出す
for num in array[::-1]:
    print(num,end="")

#ループを抜けた所で改行をする
print()

ioの出力結果です。

上記ではスライスを使ってリストをForループで逆から取り出していましたが、リストを反転させて、[1,0,1,0]を1010と表記させる方法のコードを掲載します。

この部分を別解のコードでは、[1,0,1,0]を1010になるようにansという変数を使って、Forループで計算しています。

ansの初期値は0で10倍すると0、
そこにリストから「1」を加えると「ans=1」になります。
ans=1を10倍すると10、そこにリストから「0」を加えて「ans=10」になります。
ans=10を10倍すると100、そこにリストから「1」を加えて「101」になります。
ans=101を10倍すると1010、そこにリストから「0」を加えて「1010」になります。

そのForループのトレースと、コメントアウトをしたコード、コメントアウトを取り除いたコードを掲載します。

ループに入る前にリストを反転します。

1回目のansの計算

2回目のansの計算

3回目のansの計算

4回目のansの計算

以上を踏まえて、トレースのコードを掲載します。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)

    N/=2
    N=int(N)

#リストarrayを出力
print(array)

#リストarrayを反転させる
array=list(reversed(array))

#反転させたリストarrayを出力
print(array)

#基数変換の計算結果を格納する変数ansを0で初期化
ans=0

#Forでリスト内の数を基数変換した形式で表示する

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

for num in array:
    print('計算前のans:'+str(ans))
    ans*=10
    print('10倍したans:'+str(ans))
    ans+=num
    print('計算後のans:'+str(ans))
    print('-------------------')

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


#基数変換の計算結果ansを表示させる
print(ans)

冗長な部分をコメントアウトしたコードです。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)

    N/=2
    N=int(N)

#リストarrayを出力
#print(array)

#リストarrayを反転させる
array=list(reversed(array))

#反転させたリストarrayを出力
#print(array)

#基数変換の計算結果を格納する変数ansを0で初期化
ans=0

#Forでリスト内の数を基数変換した形式で表示する

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

for num in array:
    #print('計算前のans:'+str(ans))
    ans*=10
    #print('10倍したans:'+str(ans))
    ans+=num
    #print('計算後のans:'+str(ans))
    #print('-------------------')

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


#基数変換の計算結果ansを表示させる
print(ans)

更にトレース部分のコメント部分を削除したコードです。


#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)
    N/=2
    N=int(N)


#リストarrayを反転させる
array=list(reversed(array))

#基数変換の計算結果を格納する変数ansを0で初期化
ans=0


#Forでリスト内の数を基数変換した形式で表示する

for num in array:
    ans*=10
    ans+=num

#基数変換の計算結果ansを表示させる
print(ans)

別解でも無事正解しました。

■ GASでの解き方 ■

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

スプレッドシートの黄色いセルの所に「10進数N(=10)を2進数に基数変換をした結果1010」を出力します。
基数変換の計算結果はansに格納します。
また、ansを二次元配列ans2に追加して、スプレッドシートに出力します。

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

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

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

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


3:2で割った余りを格納する配列を宣言する


4:whileループを使って余りを配列に格納する


5:配列を表示


6:配列を反転させる


7:反転した配列を表示


8:2進数を変数ansに格納する為、ansを0で初期化する

9:ループで2進数を計算する

10:ansを表示

11:スプレッドシートに格納する二次元配列ans2を宣言

12:ansをans2に二次元配列として格納

13:スプレッドシートに出力前にans2を出力して確認する

14:スプレッドシートの黄色い所に2進数に基数変換した結果を格納する

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

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

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

手順3:2で割った余りを格納する配列を宣言する

let array=[]

手順4:whileループを使って余りを配列に格納する

1回目の除算

2回目の除算

3回目の除算

4回目の除算

whileループのコードの部分です。

//whileループを使って余りを配列に格納する

  console.log('<<<whileループに入る>>>');

  while(N>=1){
    console.log(`除算前のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    //配列に余りを追加する
    array.push(N%2);
    console.log(`余り:${N%2}`);
    //除算実行
    N/=2;
    //小数点を切り捨てる
    N=Math.floor(N);
    
    console.log(`除算後のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    console.log('--------------------');

  }

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

手順5:配列を表示

console.log(array);

手順6:配列を反転させる

array=array.reverse();

手順7:反転した配列を表示

console.log(array);

配列の反転前と反転後のログです。

手順8:2進数を変数ansに格納する為、ansを0で初期化する

let ans=0;

手順9:Forループで2進数に基数変換する

1回目のansの計算

2回目のansの計算

3回目のansの計算

4回目のansの計算

Forループの部分のコードです。

console.log('<<<Forループに入る>>>');

  //ループで2進数を計算する
  for(let i=0;i<=array.length-1;i++){
    console.log(`計算前のansの値:${ans}`);
    ans*=10;
    console.log(`10倍したansの値:${ans}`);
    ans+=array[i];
    console.log(`計算後のansの値:${ans}`);
    console.log('---------------------------');
  }

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

手順10:ansを表示

console.log(ans);

手順11:スプレッドシートに格納する二次元配列ans2を宣言

let ans2=[];

手順12:ansをans2に二次元配列として格納

ans2.push([ans]);

手順13:スプレッドシートに出力前にans2を出力して確認する

console.log(ans2);

手順14:スプレッドシートの黄色い所に2進数に基数変換した結果を格納する

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

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

function loop2no10(){

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


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

  
  //2で割った余りを格納する配列を宣言する
  let array=[]
  
  
  //whileループを使って余りを配列に格納する

  console.log('<<<whileループに入る>>>');

  while(N>=1){
    console.log(`除算前のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    //配列に余りを追加する
    array.push(N%2);
    console.log(`余り:${N%2}`);
    //除算実行
    N/=2;
    //小数点を切り捨てる
    N=Math.floor(N);
    
    console.log(`除算後のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    console.log('--------------------');

  }

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


  //配列を表示
  console.log(array);

  //配列を反転させる
  array=array.reverse();

  //反転した配列を表示
  console.log(array);

  //2進数を変数ansに格納する為、ansを0で初期化する
  let ans=0;

  console.log('<<<Forループに入る>>>');

  //ループで2進数を計算する
  for(let i=0;i<=array.length-1;i++){
    console.log(`計算前のansの値:${ans}`);
    ans*=10;
    console.log(`10倍したansの値:${ans}`);
    ans+=array[i];
    console.log(`計算後のansの値:${ans}`);
    console.log('---------------------------');
  }

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

  //ansを表示
  console.log(ans);

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

  //ansをans2に二次元配列として格納
  ans2.push([ans]);

  //スプレッドシートに出力前にans2を出力して確認する
  console.log(ans2);

  //スプレッドシートの黄色い所に2進数に基数変換した結果を格納する
  ss.getRange(3,2).setValue(ans2);

}

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

みなとみらいの海と夜景

■ 参考文献の紹介■

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

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

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

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

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

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

GASで「ねこあつめ」のメッセージを使って、配列に慣れていく「ねこあつめシリーズその14」

この記事では、GAS(Google Apps Script)で「ねこあつめ」をChatworkに送信する時に、配列の取り扱いに慣れて行くことが出来るプログラムの作成を目的としています。

お世話になった記事は、いつも隣にITのお仕事さんの

【初心者向けGAS】スプレッドシートのセル範囲の値を二次元配列として取得して取り扱う方法

です。

今回の内容に入る前に、前回とそれ以前の復習をします。
前回はChatworkを使う際、APIトークンを別領域に格納するのに、プロパティストアを使いました。
また、今までは、下記のようなスプレッドシートを使って、猫ちゃんの名前をChatworkに書き出して、1番右の列を「済」にしてきました。

前回のコードです。

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

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

さて、今回の内容に入ります。

これまでA列の猫ちゃんの名前を送ってきましたが、B列の「しゅるい」とC列の「とくちょう」は何もしませんでした。
そこで今回はB列、C列も出力して行きます。

13行目のA列の猫ちゃんの名前を格納したbodyの所を変更して、B列やC列のデータも入れるようにします。
下記のコードの13行目から16行目までを追加変更しました。

//メインの関数で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の注文を受け取る
      let body="";  //←ここで、bodyにA列、B列、C列のデータを追加していくので、bodyをletで変数として宣言
      body+=ss.getRange(i,1).getValue()+'\n';
      body+=ss.getRange(i,2).getValue()+'\n';
      body+=ss.getRange(i,3).getValue()+'\n';
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

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

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

このコードを実行することで、A列からC列まで出力されています。

猫ちゃんたちの名前とともに種類や特徴がわかりますね。

ただ、ループでA列、B列、C列のセルを一つ一つ計3回アクセスして取得して、それを4匹分取得すると3×4で12回のアクセスの手間がかかってしまうんです・・・。
なので、配列を使うと便利です。

今回はcatという配列を使います。
下記コードの11行目で配列catを使って、1行3列分一気に格納しますので、getValuesと最後に「s」がついて複数形になっています。

また、スプレッドシートは二次元配列で扱うので、14行目〜16行目のcat[0][0]がA列の「なまえ」、cat[0][1]がB列の「しゅるい」、cat[0][2]がC列の「とくちょう」になっています。

配列は0か始まるので、cat[0]はcatという配列の1行目という意味です。
ループの中でcatには次の猫ちゃんの名前が入るので、配列catの1行目に次々と猫ちゃんデータが格納されるイメージです。

//メインの関数で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()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body="";  //←ここで、bodyにA列、B列、C列のデータを追加していくので、bodyをletで変数として宣言
      body+=cat[0][0]+'\n';//A列:猫ちゃんの「なまえ」
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+=cat[0][2]+'\n';//C列:猫ちゃんの「とくちょう」
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

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

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

配列を使うことによって、各回3回分のアクセスを1回(11行目)に減らせました。
なので、今まで各回3×4=12回だったのが、配列catを用いることで、各回1×4=4回のスプレッドシートのアクセスに減らせました。

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

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

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

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

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

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

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

この記事を読むことで、PythonとGASで標準入力で被除数(割られる数N)・除数(割る数M)を取得し、whileループを使って、任意の数(M)で何回割ることが出来るのか回数を数える方法が学べます。

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

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

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

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

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

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

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

任意の数で何回割れる? (paizaランク D 相当)

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

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

入力例3
81 3

出力例3
4

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

■ Pythonでの解き方 ■

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

手順として、

1:数値N=81,M=3を取得する

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


3:ループの最初にNがMで割り切れない場合は、breakでループを抜けるよう設定しています。
whileループでNがM以上という条件を満たす間、ループを回します。
Mで割っていくのにNが2.999などの数ですと、割り切ることが出来ないからです。


4:ループの中で割り算を実行します。

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

6:countを表示します。

で、行います。

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

1回目の除算

2回目の除算

3回目の除算

4回目の除算

#被除数Nと除数Mを標準入力で取得
N,M=map(int,input().rstrip().split(' '))


#NをMで割れる回数を格納する変数countを初期化する
count=0


print('<<<ループに入る>>>')

#whileループでNがM以上で尚且つ割り切れる条件の時にループを回す
while N>=M:
    print('除算前のcount:【'+str(count)+'回】')
    print('除算前のN:'+str(N))
    if N%M!=0:
        break
    
    #除算実行
    print('---「'+str(N)+'÷'+str(M)+'」を実行---')
    N/=M
    
    #countのインクリメント
    count+=1
    
    print('除算後のcount:【'+str(count)+'回】')
    print('除算後のN:'+str(N))
	
    #ループの区切り
    print('-------------------')

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

print(count)

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

#被除数Nと除数Mを標準入力で取得
N,M=map(int,input().rstrip().split(' '))


#NをMで割れる回数を格納する変数countを初期化する
count=0


#print('<<<ループに入る>>>')

#whileループでNがM以上で尚且つ割り切れる条件の時にループを回す
while N>=M:
    #print('除算前のcount:【'+str(count)+'回】')
    #print('除算前のN:'+str(N))
    if N%M!=0:
        break
    
    #除算実行
    #print('---「'+str(N)+'÷'+str(M)+'」を実行---')
    N/=M
    
    #countのインクリメント
    count+=1
    
    #print('除算後のcount:【'+str(count)+'回】')
    #print('除算後のN:'+str(N))

    #ループの区切り
    #print('-------------------')

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

print(count)

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


#被除数Nと除数Mを標準入力で取得
N,M=map(int,input().rstrip().split(' '))


#NをMで割れる回数を格納する変数countを初期化する
count=0

#whileループでNがM以上で尚且つ割り切れる条件の時にループを回す
while N>=M:
    if N%M!=0:
        break
    
    #除算実行
    #print('---「'+str(N)+'÷'+str(M)+'」を実行---')
    N/=M
    
    #countのインクリメント
    count+=1
    
print(count)

ioの出力結果です。

■ GASでの解き方 ■

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

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

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

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

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

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


3:スプレッドシートの灰色のセルから割る数の除数M(この例では「3」)を取得する


4:割り切れた回数を格納する変数countを宣言して0で初期化する


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

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

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

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

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

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

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

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

手順3:スプレッドシートの灰色のセルから割る数の除数M(この例では「3」)を取得する

const M = ss.getRange(2, 2).getValue();

手順4:割り切れた回数を格納する変数countを宣言して0で初期化する

let count=0;

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

1回目の除算

2回目の除算

3回目の除算

4回目の除算

whileループの部分のコードです。

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

  console.log('<<<ループに入る>>>');

  while (N >= M) {
    if (N % M != 0) {
      break
    }

    console.log(`除算実行前のN:${N}`);
    console.log(`除算実行前のcount:【${count}回】`);

    //除算実行
    N /= M;

    //割り算の回数をインクリメント
    count++;

    console.log(`除算実行後のN:${N}`);
    console.log(`除算実行後のcount:【${count}回】`);

    //ループ区切り
    console.log('-----------------------');

  }

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

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

let count2=[];

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

count2.push([count]);

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

console.log(count2);

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

ss.getRange(4, 1).setValue(count2);

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

function loop2no9() {

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

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

  //スプレッドシートの灰色のセルから割る数の除数M(この例では「3」)を取得する
  const M = ss.getRange(2, 2).getValue();

  //割り切れた回数を格納する変数countを宣言して0で初期化する
  let count = 0;

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

  console.log('<<<ループに入る>>>');

  while (N >= M) {
    if (N % M != 0) {
      break
    }

    console.log(`除算実行前のN:${N}`);
    console.log(`除算実行前のcount:【${count}回】`);

    //除算実行
    N /= M;

    //割り算の回数をインクリメント
    count++;

    console.log(`除算実行後のN:${N}`);
    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);

}

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

よみうりランドのXmasイルミネーション、「ジュエルミネーション」から1枚、アテネの宮廷

■ 参考文献の紹介■

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

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

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

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

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

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

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

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

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

※音量注意※

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

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

ゴンドラからの景色

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

ツリーもおしゃれ


OLYMPUS DIGITAL CAMERA

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

グッジョ!!

OLYMPUS DIGITAL CAMERA
OLYMPUS DIGITAL CAMERA

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

メリークリスマス!!

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

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

インスタ再開しました。

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

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

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