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

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

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

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

paiza レベルアップ問題集 「STEP: 2 カウント変数を使った計算」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでループを使ってリスト(配列)とループのカウント変数(i=0,1,2,…)の積を求めて出力するコードの練習が出来ます。
Pythonでは、enumerateを使って、要素と添字の演算を行います。

どちらのコードでも、カウント変数の動きが理解しやすいよう、トレースのコードを設けています。

このコーナーでは、学習コンテンツ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_1, M_2, …, M_N があります。
i 番目の M を M_i とするとき、M_i * i を改行区切りで出力してください。
例えば、M_5 が 3 の場合、3 * 5 = 15 となります。

この記事では、下記の入力例3の場合にリストの個数N=6として「8 1 3 3 1 8」が与えられていて、

「8」×1(番目)=8
「1」×2(番目)=2
「3」×3(番目)=9
「3」×4(番目)=12
「1」×5(番目)=5
「8」×6(番目)=48

を計算して求める例で進めていきます。

入力例3
6
8 1 3 3 1 8

出力例3
8
2
9
12
5
48

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

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

■ Pythonでの解き方 ■

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

手順として、

1:数値Nの個数「6」を取得する

2:リストarrayに「8 1 3 3 1 8」を取得する


3:Forループで「要素×添字+1(リストの添字は0から始まるので+1している)」の計算結果を求める

4:その計算結果を出力

で、行います。

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

#標準入力でリストの個数(長さ)Nを取得
N=int(input())

#標準入力でリストarrayを取得
array=list(map(int,input().rstrip().split(' ')))

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

#ループで「要素×添字+1」を計算
for i,num in enumerate(array):
    print('「'+str(num)+'」は「'+str(i+1)+'」番目')
    #ここで計算をしている
    ans=num*(i+1)
    print(str(num)+'×'+str(i+1)+'='+str(ans))
    print('計算結果は【'+str(ans)+'】です。')
    print('-------------------------')

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

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

#標準入力でリストの個数(長さ)Nを取得
N=int(input())

#標準入力でリストarrayを取得
array=list(map(int,input().rstrip().split(' ')))

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

#ループで「要素×添字+1」を計算
for i,num in enumerate(array):
    #print('「'+str(num)+'」は「'+str(i+1)+'」番目')
    #ここで計算をしている
    ans=num*(i+1)
    #print(str(num)+'×'+str(i+1)+'='+str(ans))
    print(ans)
    #print('-------------------------')

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

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

#標準入力でリストの個数(長さ)Nを取得
N=int(input())

#標準入力でリストarrayを取得
array=list(map(int,input().rstrip().split(' ')))


#ループで「要素×添字+1」を計算
for i,num in enumerate(array):
    #ここで計算をしている
    ans=num*(i+1)
    print(ans)

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの黄色いセルの所に「各桁の積の計算結果」を出力します。
計算結果はこの様になり、変数ansに代入します。

「8」×1(番目)=【8】
「1」×2(番目)=【2】
「3」×3(番目)=【9】
「3」×4(番目)=【12】
「1」×5(番目)=【5】
「8」×6(番目)=【48】

このansに代入された【計算結果】を二次元配列array2に追加して、スプレッドシートに出力します。

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

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

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

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


3:灰色のセルから長さNの配列(この例では「8 1 3 3 1 8」)を取得する


4:配列が取得できたことをログで確認する


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


6:Forループで上記の掛け算を演算子て、計算結果を変数ans格納して、配列array2に追加する。


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


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

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

const ss=SpreadsheetApp.getActiveSheet();

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

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

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

手順3:灰色のセルから長さNの配列(この例では「8 1 3 3 1 8」)を取得する

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

手順4:配列が取得できたことをログで確認する

console.log(array);

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

let array2=[];

手順6:Forループで上記の掛け算の計算結果を変数ans格納して、配列array2に追加する

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

また、array[o][i]としているのは、スプレッドシートは二次元配列で格納させるため、array[0]で最初の行目の0列目、1列目、2列目、3列目、4列目、5列目と走査していくからです。

ループの中のトレースログでは、array[0][i]*(i+1)=ansを計算しています。

i=0の時

array[0][0]*(0+1)=81=【8】
ans=【8】をarray2に追加

i=1の時

array[0][1]*(1+1)=12=【2】
ans=【2】をarray2に追加

i=2の時

array[0][2]*(2+1)=33=【9】
ans=【9】をarray2に追加

i=3の時

array[0][3]*(3+1)=34=【12】
ans=【12】をarray2に追加

i=4の時

array[0][4]*(4+1)=15=【5】
ans=【5】をarray2に追加

i=5の時

array[0][5]*(5+1)=86=【48】
ans=【48】をarray2に追加

//Forループで上記の掛け算の計算結果を変数ans格納して、配列array2に追加する
  console.log('<<<ループに入ります!!!>>>');

  for (let i = 0; i < N; i++) {
    console.log(`「${array[0][i]}」は「${i + 1}」番目の要素です。`);
    console.log(`「${array[0][i]}×${i + 1}」を【ans】に求めます。`);

    //ここで計算をする
    let ans = array[0][i] * (i + 1);
    console.log(`計算結果ans:【${ans}】`);

    //計算結果が格納されたansを配列array2に追加する
    array2.push([ans]);

    //ループの最後の区切り
    console.log('------------------------------------');
  }

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

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

console.log(array2);

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

ss.getRange(7, 1, N).setValues(array2);

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

function loop2no7() {

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

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

  //灰色のセルから長さNの配列(この例では「8 1 3 3 1 8」)を取得する
  const array = ss.getRange(4, 1, 1, N).getValues();

  //配列が取得できたことをログで確認する
  console.log(array);

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


  //Forループで上記の掛け算の計算結果を変数ans格納して、配列array2に追加する
  console.log('<<<ループに入ります!!!>>>');

  for (let i = 0; i < N; i++) {
    console.log(`「${array[0][i]}」は「${i + 1}」番目の要素です。`);
    console.log(`「${array[0][i]}×${i + 1}」を【ans】に求めます。`);

    //ここで計算をする
    let ans = array[0][i] * (i + 1);
    console.log(`計算結果ans:【${ans}】`);

    //計算結果が格納されたansを配列array2に追加する
    array2.push([ans]);

    //ループの最後の区切り
    console.log('------------------------------------');
  }

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

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

  //スプレッドシートの黄色いセルに掛け算の計算結果が格納された二次元配列array2を出力する
  ss.getRange(7, 1, N).setValues(array2);

}

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

ゴールデンウィーク、グリーンエクササイズをしに、東京都葛飾区の水元公園へ。
たっぷりと森林浴をしてきました。

■ 参考文献の紹介■

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

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

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

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

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

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

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

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

paiza レベルアップ問題集 「FINAL問題 偶奇の判定」をPythonとGASで解いてみた

この記事を読むことで、整数やリストを標準入力で取得して、IF分岐とループを使って偶数・奇数の判定を出力する処理を、PythonとGASの両方のコードで習得することが可能になります。

Pythonでは、基本的なループとIF分岐のコードの他にそれらを1行で書き表せる【内包表記】のコードも追記しております。
最初に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 相当)

問題:
N 個の整数 a_1, a_2, …, a_N が与えられます。
この N 個の整数について、a_1 から順に 奇数か偶数か判定し、奇数なら「odd」 、偶数なら「even」を改行区切りで出力してください。

この記事では、下記の入力例1の場合、N=5で5個の数値のリストに「1 2 3 4 5」が与えられて、その奇数・偶数の判定を行う、という条件で解いて行きます。

入力例1
5
1 2 3 4 5

出力例1
odd
even
odd
even
odd

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

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

■ Pythonでの解き方 ■

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

手順として、

1:標準入力でリストの個数を取得

2:標準入力でリストを取得


2:ForループとIFで剰余演算子「%」を使って「%2==0」を「even(偶数)」、そうでないもの「odd(奇数)」を判定して出力

で、行います。
まずは、基本的なForとIFを用いたコードです。

#リストの要素数を取得する
N=int(input())

#リストを取得する
array=list(map(int,input().rstrip().split(' ')))

#ループで偶奇の判定をする
for num in array:
    if num%2==0:
        print('even')
    else:
        print('odd')

次に、上記のForとIFの箇所に【内包表記】を施したコードです。


#リストの要素数を取得する
N=int(input())

#リストを取得する
array=list(map(int,input().rstrip().split(' ')))


#【内包表記】ループで偶奇の判定をする
[print('even') if num%2==0 else print('odd') for num in array]        

ioの出力結果です。

■ GASでの解き方 ■

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

黄色いセルの所に「偶数・奇数の判定」を出力します。

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

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

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

2:スプレッドシートの緑色のセルから配列の個数を取得する

3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する

4:ログで配列が取得できたことを確認

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

6:ForループとIF文で剰余演算子「%」を使って「%2==0」を「even(偶数)」、そうでないものを「odd(奇数)」と判定して配列array2に追加。

7:スプレッドシート出力前に「even,odd(偶数・奇数)の判定」が格納された二次元配列array2のログ出力で確認する

8:スプレッドシートの黄色いセルに「even,odd」が格納された二次元配列array2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑色のセルから配列の個数を取得する

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

手順3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する

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

手順4:ログで配列を取得できたことを確認

console.log(array);

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

let array2=[]

手順6:ForループとIF文で剰余演算子「%」を使って「%2==0」を「even(偶数)」、そうでないものを「odd(奇数)」と判定して配列array2に追加。

//ForループとIF文で剰余演算子「%」を使って「%2==0」を「even(偶数)」、そうでないものを「odd(奇数)」と判定して配列array2に追加。
  for (let i = 0; i < N; i++) {
    if (array[0][i] % 2 == 0) {
      array2.push(['even']);
    } else {
      array2.push(['odd']);
    }
  }

array[o][i]としているのは、スプレッドシートは二次元配列で格納させるため、array[0]で最初の行目の0列目、1列目、2列目、3列目、4列目と走査していくからです。

手順7:スプレッドシート出力前に「even,odd(偶数・奇数)の判定」が格納された二次元配列array2のログ出力で確認する

console.log(array2);

手順8:スプレッドシートの黄色いセルに「even,odd」が格納された二次元配列array2を出力する

ss.getRange(7,1,N).setValues(array2);

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

function loop2no5() {

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

  //スプレッドシートの緑色のセルから配列の個数を取得する
  const N = ss.getRange(1, 2).getValue();

  //配列arrayを宣言して、灰色のセルの範囲の配列を格納する
  const array = ss.getRange(4, 1, 1, N).getValues();

  //ログで配列が取得できたことを確認
  console.log(array);

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

  //ForループとIF文で剰余演算子「%」を使って「%2==0」を「even(偶数)」、そうでないものを「odd(奇数)」と判定して配列array2に追加。
  for (let i = 0; i < N; i++) {
    if (array[0][i] % 2 == 0) {
      array2.push(['even']);
    } else {
      array2.push(['odd']);
    }
  }

  //スプレッドシート出力前に「even,odd(偶数・奇数)の判定」が格納された二次元配列array2のログ出力で確認する
  console.log(array2);

  //スプレッドシートの黄色いセルに「even,odd」が格納された二次元配列array2を出力する
  ss.getRange(7, 1, N).setValues(array2);

}

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

六本木ヒルズのハロウィン、お化けカボチャ

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 4 割り切れる数だけ出力」をPythonとGASで解いてみた

この記事を読むことで、「3で割り切れる数のみを出力する処理」を、PythonとGASの両方のコードでForループとIF文を使って習得することが可能です。

Pythonでは、基本的なループとIF分岐のコードの他にそれらを1行で書き表せる、
【内包表記】のコードも追記しております。

最初に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 相当)

問題:
N個の整数 a_1, a_2, …, a_N が与えられます。
このN個の整数のうち、a_1 から順に「3で割り切れるか」判定し、割り切れる場合のみ改行区切りで出力してください。また、N個の整数には3で割り切れる数が少なくとも 1 つ含まれています。

この記事では入力例1の場合、N=6で6個の数値のリストに「1 2 3 4 5 6」が与えられたという条件で解いて行きます。

入力例1
6
1 2 3 4 5 6

出力例1
3
6

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

<<Pythonでの解き方>>

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

手順として、
1:標準入力でリストの個数を取得
2:標準入力でリストを取得
2:ForループとIFで剰余演算子「%」を使って「%3==0」を「3で割り切れる数」と判定して出力

まずは、基本的なForとIFを用いたコードです。

#リストの数値の個数を取得
N=int(input())

#リストを取得
array=list(map(int,input().rstrip().split(' ')))

#For文とIF文でリストの数値が3で割り切れる場合のみ出力する
for num in array:
    if num%3==0:
        print(num)

次に、上記のForとIFの箇所に【内包表記】を施したコードです。

#リストの数値の個数を取得
N=int(input())

#リストを取得
array=list(map(int,input().rstrip().split(' ')))

#【内包表記】For文とIF文でリストの数値が3で割り切れる場合のみ出力する
[print(num) for num in array if num%3==0]        

ioの出力結果です。

<<GASでの解き方>>

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

黄色いセルの所に「3で割り切れる数」を出力します。

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

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

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

2:スプレッドシートの緑色のセルから配列の個数を取得する

3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する

4:ログで配列が取得できたことを確認

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

6:ForループとIF文で剰余演算子「%」を使って「%3==0」を「3で割り切れる数」と判定して配列array2に追加。

7:スプレッドシート出力前に「3で割り切れる数」が格納された二次元配列array2のログ出力で確認する

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

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑色のセルから配列の個数を取得する

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

手順3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する

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

手順4:ログで配列を取得できたことを確認

console.log(array);

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

let array2=[]

手順6:ForループとIF文で剰余演算子「%」を使って「%3==0」を「3で割り切れる数」と判定して配列array2に追加。
スプレッドシートでは2次元配列で格納されているので、array[0][i]と記述して、配列の1行目をループで配列の中身が奇数かどうか確認しています。

//ForループとIF文で剰余演算子「%」を使って「%3==0」を「3で割り切れる数」と判定して配列array2に追加。
  for (let i = 0; i < N; i++) {
    if (array[0][i] % 3 == 0) {
      array2.push([array[0][i]]);
    }
  }

手順7:スプレッドシート出力前に「3で割り切れる数」が格納された二次元配列array2のログ出力で確認する

console.log(array2);

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

ss.getRange(7,1,array2.length).setValues(array2);

(7,1,array2.length)は、スプレッドシートのセルA7からarray2の長さ分のセル範囲を確保して、「3で割り切れる数」が格納された配列のarray2を出力するように設定しています。

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

function loop2no4() {

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

  //スプレッドシートの緑色のセルから配列の個数を取得する
  const N = ss.getRange(1, 2).getValue();

  //配列arrayを宣言して、灰色のセルの範囲の配列を格納する
  const array = ss.getRange(4, 1, 1, N).getValues();

  //ログで配列が取得できたことを確認
  console.log(array);

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


  //ForループとIF文で剰余演算子「%」を使って「%3==0」を「3で割り切れる数」と判定して配列array2に追加。
  for (let i = 0; i < N; i++) {
    if (array[0][i] % 3 == 0) {
      array2.push([array[0][i]]);
    }
  }

  //スプレッドシート出力前に「3で割り切れる数」が格納された二次元配列array2のログ出力で確認する
  console.log(array2);


  //スプレッドシートの黄色いセルに「3で割り切れる数」が格納された二次元配列array2を出力する
  ss.getRange(7, 1, array2.length).setValues(array2);

}

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

バカラのシャンデリア(ピンク)

■ 参考文献の紹介■

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 3 奇数だけ出力」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASの両方のコードで、ForループとIF文を使った奇数のみの出力の仕方を学べます。Pythonのコードでは、基本的なFor文・IF文のコードの他に、【内包表記】を使ってそれらを1行で記述するコードも追記しております。
最初に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 相当)

問題:
N 個の整数 a_1, a_2, …, a_N が与えられます。
この N 個の整数のうち、a_1 から順に奇数か偶数か判定し、奇数の場合のみ改行区切りで出力してください。
また、N 個の整数には奇数が少なくとも 1 つ含まれています。

この記事では、入力例1でN=5の5個の数値のリストに「1 2 3 4 5」が与えられて、その中から奇数を出力するという条件で解いて行きます。

入力例1
5
1 2 3 4 5

出力例1
1
3
5

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

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

<<Pythonでの解き方>>

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

手順として、
1:標準入力でリストの個数を取得
2:標準入力でリストを取得
2:ForループとIFで剰余演算子「%」を使って「%2==1」を奇数と判定して出力

まずは、基本的なForとIFを用いたコードです。

#数値の個数N
N=int(input())

#N個のリストarray
array=list(map(int,input().rstrip().split(' ')))

#ループで奇数の時だけ出力する
for num in array:
    if num%2==1:
        print(num)

次に、上記のForとIFに内包表記を施したコードです。

#数値の個数N
N=int(input())

#N個のリストarray
array=list(map(int,input().rstrip().split(' ')))

#【内包表記】ループで奇数の時だけ出力する
[print(num) for num in array if num%2==1]        

【内包表記】で、ループの部分が1行になっていることが確認出来ました。

Ioの出力結果です。

<<GASでの解き方>>

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

黄色いセルの所に奇数を出力します。

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

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

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

2:スプレッドシートの緑色のセルから配列の個数を取得する


3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する


4:ログで配列が取得できたことを確認


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


6:ForループとIF文で剰余演算子「%」を使って「%2==1」を奇数と判定して配列array2に追加。


7:スプレッドシート出力前に奇数が格納された二次元配列array2のログ出力で確認する

8:スプレッドシートの黄色いセルに奇数が格納されたarray2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑色のセルから配列の個数を取得する

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

手順3:配列arrayを宣言して、灰色のセルの範囲の配列を格納する

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

手順4:ログで配列を取得できたことを確認

console.log(array);

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

let array2=[]

手順6:ForループとIF文で剰余演算子「%」を使って「%2==1」を奇数と判定して配列array2に追加。

スプレッドシートでは2次元配列で格納されているので、array[0][i]と記述して、配列の1行目をループで配列の中身が奇数かどうか確認しています。

//ForループとIF文で剰余演算子「%」を使って「%2==1」を奇数と判定して配列array2に追加。
  for(let i=0;i<N;i++){
    if(array[0][i]%2==1){
      array2.push([array[0][i]]);
    }
  }

手順7:スプレッドシート出力前に奇数が格納された二次元配列array2のログ出力で確認する

console.log(array2);

手順8:スプレッドシートの黄色いセルに奇数が格納されたarray2を出力する

ss.getRange(7,1,array2.length).setValues(array2);

(7,1,array2.length)は、スプレッドシートのセルA7からarray2の長さ分(array2.length)のセル範囲を確保して、奇数が格納された配列のarray2を出力するように設定しています。

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

function loop2no3() {

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

  //スプレッドシートの緑色のセルから配列の個数を取得する
  const N = ss.getRange(1, 2).getValue();

  //配列arrayを宣言して、灰色のセルの範囲の配列を格納する
  const array = ss.getRange(4, 1, 1, N).getValues();

  //ログで配列が取得できたことを確認
  console.log(array);

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


  //ForループとIF文で剰余演算子「%」を使って「%2==1」を奇数と判定して配列array2に追加。
  for (let i = 0; i < N; i++) {
    if (array[0][i] % 2 == 1) {
      array2.push([array[0][i]]);
    }
  }

  //スプレッドシート出力前に奇数が格納された二次元配列array2のログ出力で確認する
  console.log(array2);


  //スプレッドシートの黄色いセルに奇数が格納されたarray2を出力する
  ss.getRange(7, 1, array2.length).setValues(array2);
}

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

目白庭園の紅葉

■ 参考文献の紹介■

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

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

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

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

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

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

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