paiza レベルアップ問題集 「FINAL問題 【行入力】1,000 行の入力」をPythonとGASで解いてみた

この記事を読むことで、ループを使って1000行分もの文字列をPythonの標準入力で文字列を取得・出力する方法、GASでは最初に入力欄を作成して準備を整えた上で、その後に二次元配列として取得、出力する方法が学べます。

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

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

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

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

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

【行入力】1,000 行の入力 (paizaランク D 相当)

問題:
s_1, s_2, s_3, … s_999, s_1000 の 1,000 個の文字列が与えられます。
文字列を与えられた順番通りに出力してください。

この記事では、下記の入力例1の場合を例にして、文字列の出力を行います。

入力例1
paiza0
paiza1
paiza2
paiza3
paiza4
paiza5
paiza6
paiza7
paiza8
paiza9



(以下略)



paiza990
paiza991
paiza992
paiza993
paiza994
paiza995
paiza996
paiza997
paiza998
paiza999

出力例1

paiza0
paiza1
paiza2
paiza3
paiza4
paiza5
paiza6
paiza7
paiza8
paiza9



(以下略)



paiza990
paiza991
paiza992
paiza993
paiza994
paiza995
paiza996
paiza997
paiza998
paiza999

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

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

■ Pythonでの解き方 ■

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

(以下略・・・)

手順として、

1:問題文から1000行と分かっているのでループを1000回まわし、ループの中で標準入力で取得した文字列を変数tempに格納して出力する

で、行います。

この手順で作成したプログラムを実行した出力結果です。

Pythonのコードはこちらになります。

#問題文から1000行と分かっているのでループを1000回まわし、ループの中で標準入力で取得した文字列を変数tempに格納して出力する
for i in range(1000):
    temp=input()
    print(temp)

■ GASでの解き方 ■

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

今回はA列の入力欄にpaiza0,paiza1,paiza2・・・paiza997,paiza998,paiza999と1000行ものデータを用意しなければなりません。さすがに手打ちではきついので、まず最初にこのようなコードを書いきました。

準備の手順です。

1:SpreadSheetAppからアクティブシートにアクセスする

2:A列にpaiza0からpaiza999まで出力するのに事前に文字列を格納する配列columnAを宣言

3:ループを使って配列columnAにpaiza0からpaiza999までの値を追加していく

4:スプレッドシートのA列に格納する前にログで確認する

5:スプレッドシートのA列の入力の下に配列columnAの値を格納する

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

手順2:A列にpaiza0からpaiza999まで出力するのに事前に文字列を格納する配列columnAを宣言

let columnA=[];

手順3:ループを使って配列columnAにpaiza0からpaiza999までの値を追加していく

//ループを使って配列columnAにpaiza0からpaiza999までの値を追加していく
  for(let i=0;i<1000;i++){
    columnA.push(['paiza'+i]);
  }

手順4:スプレッドシートのA列に格納する前にログで確認する

console.log(columnA);

ログでは1000行は多過ぎて、全ては表示しきれませんでした。

手順5:スプレッドシートのA列の入力の下に配列columnAの値を格納する

ss.getRange(2,1,columnA.length).setValues(columnA);

そのログ出力と実行結果です。

スプレッドシートはpaiza0からpaiza999までの1000行表示出来ました。

(・・・中略・・・)

ここまでのコードです。

function standardInput05(){
  
  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

  //A列にpaiza0からpaiza999まで出力するのに事前に文字列を格納する配列columnAを宣言
  let columnA=[];

  //ループを使って配列columnAにpaiza0からpaiza999までの値を追加していく
  for(let i=0;i<1000;i++){
    columnA.push(['paiza'+i]);
  }

  //スプレッドシートのA列に格納する前にログで確認する
  console.log(columnA);

  //スプレッドシートのA列の入力の下に配列columnAの値を格納する
  ss.getRange(2,1,columnA.length).setValues(columnA);
}

準備が整ったところで、A列の文字入力部分を二次元配列として取得して、C列の黄色いセルにそのまままの順番で文字列を出力します。プログラミングの手順は下記のようになります。

6:A列の値を定数numに格納する

7:numをC列に出力する

手順6:A列の値を定数numに格納する

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

手順7:numをC列に出力する

ss.getRange(2,3,1000).setValues(num);

実行後のスプレッドシートです。見やすくするように、最初の行を固定していあります。

(・・・中略・・・)

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

function standardInput05() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss = SpreadsheetApp.getActiveSheet();

  //A列にpaiza0からpaiza999まで出力するのに事前に文字列を格納する配列columnAを宣言
  let columnA = [];

  //ループを使って配列columnAにpaiza0からpaiza999までの値を追加していく
  for (let i = 0; i < 1000; i++) {
    columnA.push(['paiza' + i]);
  }

  //スプレッドシートのA列に格納する前にログで確認する
  console.log(columnA);

  //スプレッドシートのA列の入力の下に配列columnAの値を格納する
  ss.getRange(2, 1, columnA.length).setValues(columnA);

  //A列の値を定数numに格納する
  const num = ss.getRange(2, 1, 1000).getValues();

  //numをC列に出力する
  ss.getRange(2, 3, 1000).setValues(num);

}

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

東京都足立区、遊歩道の桜

■ 参考文献の紹介■

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

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

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

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

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

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

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

paiza レベルアップ問題集 「STEP: 4 10 行の入力」をPythonとGASで解いてみた

この記事を読むことで、ループを使って10行分の文字列をPythonの標準入力で文字列を取得・出力する方法、GASでは二次元配列として取得、出力する方法が学べます。

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

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

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

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

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

10 行の入力 (paizaランク D 相当)

問題:
s_1, s_2, s_3, … s_9, s_10 の 10 個の文字列が与えられます。
文字列を与えられた順番通りに出力してください。

この記事では、下記の入力例1の場合を例にして、文字列の出力を行います。

入力例1
one
two
three
four
five
six
seven
eight
nine
ten

出力例1
one
two
three
four
five
six
seven
eight
nine
ten

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

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

■ Pythonでの解き方 ■

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

手順として、

1:問題文から10行と分かっているのでループを10回まわし、ループの中で標準入力で取得した文字列を変数tempに格納して出力する

で、行います。

この手順で作成したプログラムを実行した出力結果です。

Pythonのコードはこちらになります。

#問題文から10行と分かっているのでループを10回まわし、ループの中で標準入力で取得した文字列を変数tempに格納して出力する
for i in range(10):
    temp=input()
    print(temp)

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに文字列「one,two,・・・,nine,ten」を入力しました。
これを二次元配列として取得して、黄色いセルにそのまままの順番で文字列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

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

1:SpreadSheetAppからアクティブシートにアクセスする

2:スプレッドシートの緑のセルの文字列「one,two,・・・,nine,ten」が入っている箇所をarrayに10行1列の二次元配列として取得する

3:配列arrayに文字列が取得出来たことをログ出力で確認する

4:スプレッドシートの黄色いセルに二次元配列arrayを出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑のセルの文字列「one,two,・・・,nine,ten」が入っている箇所をarrayに10行1列の二次元配列として取得する

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

valueではなく、valuesと「s」を付けると複数の文字列を取得できます。

手順3:配列arrayに文字列が出力出来たことをログ出力で確認する

console.log(array);

手順4:スプレッドシートの黄色いセルに二次元配列arrayを出力する

ss.getRange(2,3,array.length).setValues(array);

スプレッドシートの2行目3列目(C2)から配列arrayの長さである10行分を確保してarrayを出力しています。

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

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

function standardInput04() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss = SpreadsheetApp.getActiveSheet();

  //スプレッドシートの緑のセルの文字列「one,two,・・・,nine,ten」が入っている箇所をarrayに10行1列の二次元配列として取得する
  const array = ss.getRange(2, 1, 10).getValues();

  //配列arrayに文字列が取得出来たことをログ出力で確認する
  console.log(array);

  //スプレッドシートの黄色いセルに二次元配列arrayを出力する
  ss.getRange(2, 3, array.length).setValues(array);

}

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

石神井公園(東京都練馬区)でサイクルボートを漕ぎながら撮影した写真

■ 参考文献の紹介■

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

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

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

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

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

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

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

【paiza レベルアップ問題集 】「標準入力その1 STEP: 3 3 行の入力」PythonとGASで解いたコード紹介

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、安心して下さい。)


3 行の入力 (paizaランク D 相当)

問題:
文字列 s, t, u が 3 行で与えられるので、s, t, u の 3 行をそのまま出力してください。

この記事では、下記の入力例1の場合を例にして、文字列の出力を行います。

入力例1
abc
def
ghi

出力例1
abc
def
ghi


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

■ Pythonでの解き方 ■

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

手順として、

1:問題文から3行と分かっているのでループを3回まわし、ループの中で標準入力で取得した文字列を変数tempに格納して出力する

で、行います。
こちらがPythonのコードになります。

#ループを3回まわし、ループの中で標準入力で取得した文字列を変数tempに格納して出力する
for i in range(3):
    temp=input()
    print(temp)

この手順で作成したプログラムを実行した出力結果です。


■ GASでの解き方 ■

今度は、同じ問題をGASで解いてみます。
まず、この様なスプレッドシートを用意しました。

スプレッドシートの緑のセルに文字列「abc」,灰色のセルに「def」,ピンクのセルに「efg」を入力しました。
これを二次元配列として取得して、黄色いセルにそのままの順番で文字列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

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

1:SpreadSheetAppからアクティブシートにアクセスする

2:最初の文字列「abc」が入っている緑のセルA1と、その下の灰色のセル「def」が入っているセルA2、最後のピンクのセルA3
「ghi」を配列arrayに3行1列の二次元配列として取得する

3:配列arrayに文字列が取得出来たことをログ出力で確認する

4:スプレッドシートの黄色いセルに二次元配列arrayを出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

関数「standardInput3」を書いていきます。Standard Inputは標準入力の意味です。

function standardInput3() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();
  
}

手順2:最初の文字列「abc」が入っている緑のセルA1と、その下の灰色のセルA2の「def」と、最後のピンクのセルA3に入っている「ghi」を配列arrayに3行1列の二次元配列として取得する

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

valueではなく、valuesと「s」を付けると複数の文字列を取得できます。
コメントが複数行に渡る際は「/*」と「*/」で囲います。

function standardInput3() {

  const ss=SpreadsheetApp.getActiveSheet();

  /*文字列「abc」が入っている緑のセルA1と
  その下の灰色のセル「def」が入っているセルA2と
  最後の「ghi」が入っているピンクのセルA3を
  配列arrayに3行1列の二次元配列として取得する
  */
  const array = ss.getRange(1,1,3).getValues();
 
}

手順3:配列arrayに文字列が出力出来たことをログ出力で確認する

console.log(array);

配列arrayを出力して、A1,A2,A3の文字列が無事に配列に格納されていることを確認します。

function standardInput3() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array = ss.getRange(1,1,3).getValues();

  //配列arrayに文字列が取得出来たことをログ出力で確認する
  console.log(array);
  
}

上記の実行結果です。

手順4:スプレッドシートの黄色いセルに二次元配列arrayを出力する

ss.getRange(6,1,array.length).setValues(array);

スプレッドシートのA6である6行目1列目から配列arrayの長さである3行分を確保してarrayを出力しています。

array.lengthでlengthメソッドを使って配列の長さである3を求めています。
これで3行分が確保されて出力されます。

function standardInput3() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array = ss.getRange(1,1,3).getValues();
  console.log(array);
  
  //lengthメソッドを用いて配列arrayの長さを求める
  console.log(array.length);

  //スプレッドシートの黄色いセルA6から3行分二次元配列arrayを出力する
  ss.getRange(6,1,array.length).setValues(array);

}

実行後のログとスプレッドシートです。

お疲れ様でした。ブレイクタイムPhotoは、

お台場の中でもオススメスポット、モノレールゆりかもめ線 芝浦ふ頭のレインボーブリッジです。

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

■ 関連記事 ■

paizaレベルアップ問題集「標準入力その1」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

【paiza レベルアップ問題集 】「標準入力その1 STEP: 2 2 行の入力」PythonとGASの両方で解いたコード紹介

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、安心して下さい。)


2 行の入力 (paizaランク D 相当)

問題:
文字列 s と t が 2 行で与えられるので、s と t の 2 行をそのまま出力してください。

この記事では、下記の入力例2の場合を例にして、文字列の出力を行います。

入力例2
heisei31
reiwa1

出力例2
heisei31
reiwa1

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


■ Pythonでの解き方 ■

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

手順として、

1:標準入力で最初の文字列sを読み込む

2:標準入力で次の文字列tを読み込む


3:print文でsを出力する


4:print文でtを出力する

この様に行います。

この手順に沿って作成したPythonのコードと実行した出力結果です。

#標準入力で最初の文字列sを読み込む
s=input()
#標準入力で次の文字列tを読み込む
t=input()

#print文でsを出力する
print(s)
#print文でtを出力する
print(t)


■ GASでの解き方 ■

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

スプレッドシートの緑のセルA1に文字列「heisei31」を入力して、灰色のセルにA2に「reiwa 1」を入力して、それらを二次元配列として取得します。
最後にその二次元配列を黄色いセルにそのままま文字列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

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

1:SpreadSheetAppからアクティブシートにアクセスする

2:最初の文字列「heisei31」が入っている緑のセルとその下の灰色のセル「reiwa1」が入っているセルを配列arrayに2行1列の二次元配列として取得する

3:配列arrayに文字列が出力出来たことをログ出力で確認する

4:スプレッドシートの黄色いセルに二次元配列arrayを出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

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

関数「standardInput2」の中に書いていきます。
Standard Inputで標準入力の意味です。

function standardInput2() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

}

手順2:最初の文字列「heisei31」が入っている緑のセルと、その下の灰色のセル「reiwa1」が入っているセルを配列arrayに2行1列の二次元配列として取得する

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

セルA1は1行目1列目ですので、(1,1)と表せて、そこから2行分ですので、(1,1,2)となります。1列取得のみですので、(1,1,2,1)の最後の1は略せます。

2文字分ですので、getValuesと「s」が付きます。
また、複数行に渡るコメントの場合は、「/*」と「*/」で囲います。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  /*最初の文字列「heisei31」が入っている緑のセルと、
  その下の灰色のセル「reiwa1」が入っているセルを
  配列arrayに2行1列の二次元配列として取得する*/

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

}

手順3:配列arrayに文字列が出力出来たことをログ出力で確認する

console.log(array);

スプレッドシートから取得した文字列を格納した配列arrayが無事にログ出力されることを確認します。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,2).getValues();

 //配列arrayの出力確認
  console.log(array);

}

手順4:スプレッドシートの黄色いセルに二次元配列arrayを出力する

ss.getRange(5,1,array.length).setValues(array);

スプレッドシートの黄色いセルA5(5,1)とA6に、配列arrayの長さである2行1列分を確保してarrayを出力しています。

array.lengthで、lengthメソッドを使っていることで、配列の長さである2を表しています。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,2).getValues();

  
  console.log(array);

  //lengthメソッドで配列の長さ2が出力される
  console.log(array.length);

  //スプレッドシートの黄色いセルに二次元配列arrayを出力する
  ss.getRange(5,1,array.length).setValues(array);

}

実行後のログとスプレッドシートです。


お疲れ様でした。ブレイクタイムPhotoは、

お台場自由の女神と、レインボーブリッジと、レインボーブリッジの右から1cmぐらいの所にある東京タワーです。

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

■ 関連記事 ■

paizaレベルアップ問題集「標準入力その1」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

【paiza レベルアップ問題集 】「標準入力その1 STEP: 1 1 行の入力」PythonとGASの両方で解いたコード紹介

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、安心して下さい。)


1 行の入力 (paizaランク D 相当)

問題:
文字列 s が 1 行で与えられるので s をそのまま出力してください。

この記事では、下記の入力例1の場合を例にして、文字列の出力を行います。

入力例1
paiza

出力例1
paiza

ではまず、Pythonでのコードを掲載致します。


■ Pythonでの解き方 ■

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

手順として、

1:標準入力で最初の単語wordを読み込む

2:print文でwordを出力する

で、行います。
コードはこちらになります。

#標準入力で文字列を読み込む
word=input()

#その文字列を出力する
print(word)

この手順で作成したプログラムを実行した出力結果です。


■ GASでの解き方 ■

では、同じ問題をGASで解いてみます。
まず、スプレッドシートに下記の様に入力及びセルの塗り潰しを致しました。

スプレッドシートの緑のセルに文字列「paiza」を入力しました。
これを黄色いセルにそのままま文字列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

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

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

2:緑のセルから文字列を取得する

3:文字列が出力出来たことをログ出力で確認する

4:文字列をスプレッドシートに二次元配列として取得する配列word2を宣言する

5:word2が二次元配列になる様に、wordを追加する

6:スプレッドシート出力前にログで確認する

7:スプレッドシートの黄色いセルに出力する

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

const ss=SpreadsheetApp.getActiveSheet();

関数「standardInput1」の中にコードを書いていきます。
standard input は、標準入力のことです。

function standardInput1() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();
  
}

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

手順2:緑のセルから文字列を取得する

const word=ss.getRange(1,1).getValue();

緑のセルはA1であり、(1,1)と表記出来ます。

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルA1から文字列を取得する
  const word=ss.getRange(1,1).getValue();

}

手順3:文字列が出力出来たことをログ出力で確認する

console.log(word);

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const word=ss.getRange(1,1).getValue();

  //文字列が出力出来たことをログ出力で確認する
  console.log(word);

}

手順4:文字列をスプレッドシートに二次元配列として取得する配列word2を宣言する

let word2=[];

スプレッドシートは縦×横の二次元ですので、二次元配列として出力する準備を行います。

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const word=ss.getRange(1,1).getValue();
  console.log(word);

  //文字列をスプレッドシートに二次元配列として取得する配列word2を宣言する
  let word2=[];

}

手順5:word2が二次元配列になる様に、wordを追加する

word2.push([word]);

pushメソッドを使って、[ ]の中にwordを入れて二次元配列にしています。

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const word=ss.getRange(1,1).getValue();
  console.log(word);


  let word2=[];

  //word2が二次元配列になる様に、pushメソッドを使ってwordを追加する
  word2.push([word]);

}

手順6:スプレッドシート出力前にログで確認する

console.log(word2);

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const word=ss.getRange(1,1).getValue();
  console.log(word);


  let word2=[];
  word2.push([word]);

  //スプレッドシート出力前にログで確認する
  console.log(word2);

}

手順7:スプレッドシートの黄色いセルに出力する

ss.getRange(3,1).setValue(word2);

黄色いセルはセルA3ですので、3行目1列目で(3,1)と表記します。

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const word=ss.getRange(1,1).getValue();
  console.log(word);


  let word2=[];
  word2.push([word]);
  console.log(word2);

  //スプレッドシートの黄色いセルに出力する
  ss.getRange(3,1).setValue(word2);

}

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


お疲れ様でした。ブレイクタイムPhotoは、

ここは本当に、東京23区ですか??と驚く様な、世田谷区の等々力渓谷で水と森林にたっぷりと癒されました。

次の問題へ→

■ 関連記事 ■

paizaレベルアップ問題集「標準入力その1」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

【paiza レベルアップ問題集】 「STEINS;GATE FINAL 正則表現のエントリーポイント」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、

・Pythonの標準入力で文字列を取得する方法

・GASでは二次元配列として文字列を取得する方法

・Python・GASで文字列を連結して出力する方法

についての概要が掴めます。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、安心して下さい。)

正則表現のエントリーポイント (paizaランク D 相当)

問題:
あなたはプログラミングの課題を解いています。
2 つの単語が改行区切りで入力されるので「;」区切りで出力してください。

この記事では、下記の入力例1の場合を例にして、標準入力で2つの単語を取得して「;」を用いて文字列の連結をして出力します。

入力例1
STEINS
GATE

出力例1
STEINS;GATE

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

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

手順として、

1:標準入力で最初の単語a(今回はSTEINS)を読み込む

2:標準入力で最初の単語b (GATE)を読み込む


3:「;」を使って2つの文字列を連結して出力する

で、行います。

この手順で作成したプログラムを実行した出力結果です。

コードはこちらになります。

#標準入力で最初の文字と次の文字を読み込む
a=input()
b=input()

#「;」を用いて文字を連結して出力する
print(a+';'+b)

Pythonでの解き方は以上になります。


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

スプレッドシートの緑のセルに最初の文字「STEINS」を入力しました。
スプレッドシートの灰色のセルに次の文字「GATE」を入力しました。

上記のセル2つはarrayという二次元配列として一度に取得します。そうすることによって、SpreadSheetAppから階層を辿って現在のシートにアクセスするという手間を減らすことが出来ます。

黄色いセルには、二次元配列arrayから2つの文字列を取得し「;」で連結した文字列を出力します。

※スプレッドシートに表示するには、二次元配列に文字列を追加をしております※

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

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

2:スプレッドシートの緑のセルに入力された「STEINS」と、灰色のセルに入力された「GATE」の部分を二次元配列arrayとして取得する


3:二次元配列arrayが無事取得出来たことをログで出力して確認する

4:二次元配列array[0][0]とarray[1][0]を「;」も用いて連結して定数strに代入する

5:文字列の連結が出来たことをstrをログ出力して確認する

6:スプレッドシートに二次元配列として取得する配列str2を宣言する

7:str2が二次元配列になるようにstrを追加する

8:str2をスプレッドシートに出力する前にログ出力して確認する

9:スプレッドシートの黄色い所に二次元配列str2を出力する

少々長くなってしまって恐縮ですが、それでは手順ごとにコードを掲載致します。

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

const ss=SpreadsheetApp.getActiveSheet();

function steinsGate() {

  //現在のスプレッドシートに階層を辿ってアクセスする
  const ss=SpreadsheetApp.getActiveSheet();
  
}

関数steinsGateの中に、まずはSpreadsheetAppから階層を辿ってアクティブシートにアクセスして定数ssに代入しています。

手順2:2つの文字列を二次元配列として取得

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

セルA1から2行分1列分の二次元配列として取得しています。

function steinsGate() {

  const ss=SpreadsheetApp.getActiveSheet();

  //2つの文字列を二次元配列として取得
  const array=ss.getRange(1,1,2).getValues();

}

手順3:取得した二次元配列をログ出力で確認する
2行1列の二次元配列として取得出来たことをログで出力して確認します。

console.log(array);

function steinsGate() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,2).getValues();

  //取得した二次元配列をログ出力で確認する
  console.log(array);

}

手順4:文字列を連結させる

const str=array[0][0]+”;”+array[1][0];

文字列は二次元配列で、最初の行の0番目のarray[0][0]と、次の行の0番目のarray[1][0]を「;」で文字列を連結させて定数strに代入しています。

function steinsGate() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,2).getValues();
  console.log(array);

  //文字列を連結させる
  const str=array[0][0]+";"+array[1][0];
}

手順5:文字列の連結をログ出力で確認する

console.log(str);

function steinsGate() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,2).getValues();
  console.log(array);

  const str=array[0][0]+";"+array[1][0];
  
  //文字列の連結をログ出力で確認する
  console.log(str);

}

手順6:連結させた文字列を二次元配列として格納させる配列str2を宣言

let str2=[];

スプレッドシートは縦横の二次元配列なので、それに対応した、新たに出力用の配列を作成します。

function steinsGate() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,2).getValues();
  console.log(array);

  const str=array[0][0]+";"+array[1][0];
  console.log(str);

  //連結させた文字列を二次元配列として格納させる配列str2を宣言
  let str2=[];
 
}

手順7:str2が二次元配列になる様に、strを追加する

str2.push([str]);

配列に追加するpushメソッドを使う際、[str]を入れることで二次元配列にしてスプレッドシートに出力出来る準備をするので、[ ]を必ず入力します。

function steinsGate() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,2).getValues();
  console.log(array);

  const str=array[0][0]+";"+array[1][0];
  console.log(str);

  let str2=[];

  //str2が二次元配列になる様に、strを追加する
  str2.push([str]);

}

手順7:スプレッドシートに出力する前に確認する

console.log(str2);

function steinsGate() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,2).getValues();
  console.log(array);

  const str=array[0][0]+";"+array[1][0];
  console.log(str);

  let str2=[];
  str2.push([str]);

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

}

二次元配列になっていますね。
これでスプレッドシートに出力する準備が整いました。

手順8:スプレッドシートの黄色いセルA4に連結した文字列を出力する

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

セルA4は4行1列ですので、(4,1)と書き表せます。

function steinsGate() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,2).getValues();
  console.log(array);

  const str=array[0][0]+";"+array[1][0];
  console.log(str);

  let str2=[];
  str2.push([str]);
  console.log(str2);

  //スプレッドシートの黄色いセルに連結した文字列を出力する
  ss.getRange(4,1).setValue(str2);

}

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


お疲れ様でした。ブレイクタイムPhotoは、

お台場自由の女神とレインボーブリッジと、レインボーブリッジの右端から1cmの所の東京タワーです。

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集_PythonとGASのコード紹介トップに戻る
初めてのGASに戻る


自己紹介

paiza レベルアップ問題集 「FINAL問題 約数の列挙」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでforループとループの中で単純なIF文を使って、指定された整数の約数を全て列挙し出力することが出来るようになります。

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

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

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

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

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

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

約数の列挙 (paizaランク D 相当)

問題:
整数 N が与えられます。
N の約数を小さい方から順に改行区切りで出力してください。

この記事では、下記の入力例2の場合を例にして、標準入力でリストの要素数N=100を取得し、その約数を昇順に列挙して行きます。

入力例2
100

出力例2
1
2
4
5
10
20
25
50
100

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

■ Pythonでの解き方 ■

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

手順として、

1:Nを標準入力で取り込む

2:ループでi=1からNまでの範囲でループ内でIF文を使って、N%i==0と割り切れた場合にiを出力する

で、行います。

コードはこちらになります。

#Nを標準入力で取り込む
N=int(input())

#ループでi=1からNまでの範囲でループ内でIF文を使って、N%i==0と割り切れた場合にiを出力する
for i in range(1,N+1):
    if N%i==0:
        print(i)

この問題の類題のトレースは、前回の記事で詳しく行なっておりますので、変数の動きを知りたい方は前回の記事をご覧下さい。

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに約数を列挙する整数N:100を入力しました。
黄色いセルには配列の中にあるNの約数の個数を出力します。

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

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

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

2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する

3:整数Nが取得出来たことをログで確認する

4:約数をスプレッドシートに二次元配列として格納する配列divisorを宣言する

5:ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する

6:ループを抜けて、スプレッドシートに出力する前に配列divisorをログで出力する

7:スプレッドシートの黄色い所にdivisorを出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する

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

手順3:整数Nが取得出来たことをログで確認する

console.log(N);

手順4:約数をスプレッドシートに二次元配列として格納する配列divisorを宣言する

let divisor=[];

手順5:ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する

ループ内での約数を見つけた時の動きは、前回の記事で詳しく行なっておりますので、変数の動きを知りたい方は前回の記事をご覧下さい。

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

//ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する
  for (let i=1;i<=N;i++){
    if(N%i==0){
      divisor.push([i]);
    }
  }

手順6:ループを抜けて、スプレッドシートに出力する前に配列divisorをログで出力する

console.log(divisor);

手順7:スプレッドシートの黄色い所にdivisorを出力する

ss.getRange(3,2,divisor.length).setValues(divisor);

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

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

function loop2no20(){

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

  //スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する
  const N=ss.getRange(1,2).getValue();

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

  //約数をスプレッドシートに二次元配列として格納する配列divisorを宣言する
  let divisor=[];

  //ループ内でIF文を使ってN=100の約数を見つけたら配列divisorに追加する
  for (let i=1;i<=N;i++){
    if(N%i==0){
      divisor.push([i]);
    }
  }

  //ループを抜けて、スプレッドシートに出力する前に配列divisorをログで出力する
  console.log(divisor);

  //スプレッドシートの黄色い所にdivisorを出力する
  ss.getRange(3,2,divisor.length).setValues(divisor);

}

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

東京ドームシティ、恋するイタリア

■ 参考文献の紹介■

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

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

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

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

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

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

←前の問題へ          

paiza レベルアップ問題集 「STEP: 14 約数の個数」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでforループとループの中で単純なIF文を使ってリスト(配列)の中で約数の個数を求めることが出来るようになります。

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

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

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

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

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

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

約数の個数 (paizaランク D 相当)

問題:
整数 N が与えられます。
N の約数の個数を出力してください。
約数とは、N を割り切る整数のことを指します。

この記事では、下記の入力例2の場合を例にして、標準入力でリストの要素数N=100を取得し、その約数の個数を求めます。

入力例2
100

出力例2
9

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

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

■ Pythonでの解き方 ■

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

手順として、

1:Nを標準入力で取り込む

2:約数の個数を格納する変数countを0で初期化する


3:ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする


4:countを出力する

で、行います。

では、ループのトレースのコードの出力結果を掲載します。

i=1の時

N=100をi=1で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=2の時

N=100をi=2で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=3の時

N=100をi=3で割っても割り切れないのでIF文を飛ばします。

i=4の時

N=100をi=4で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=5の時

N=100をi=5で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

以下省略して、割り切れる所を含む部分をトレースします。

i=10〜15の時

N=100をi=10で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=11〜15まで割れません。

i=20〜26の時

N=100をi=20で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=21〜24まで割れません。

N=100をi=25で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=26は割れません。

i=50〜56の時

N=100をi=50で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

I=51〜56まで割れません。

i=95〜100の時

N=100をi=95〜99まで割っても割れません。

N=100をi=100で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

約数の個数が9個になってループを抜けました。

ループを抜けた後、約数を出力しています。

ここまでのトレースのコードです。

#Nを標準入力で取り込む
N=int(input())

#約数の個数を格納する変数countを0で初期化する
count=0

#ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする
print('<<<ループに入ります。>>>')
for i in range(1,N+1):
    print('除算前のcount:「'+str(count)+'」')
    print('N='+str(N)+'を「i='+str(i)+'」で割ります。')
    if N%i==0:
        print('i='+str(i)+'で割り切れたので約数みっけ(=^x^=)')
        count+=1
        print('count:【'+str(count)+'】')
    print('------------------------------------')
print('<<<ループを抜けました。>>>')

#countを出力する
print(count) 

ループのrange(1,N+1)となっているのは、引数の最後のところがN+1未満、すなわちNまでの範囲が適用されるからです。

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

#Nを標準入力で取り込む
N=int(input())

#約数の個数を格納する変数countを0で初期化する
count=0

#ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする
#print('<<<ループに入ります。>>>')
for i in range(1,N+1):
    #print('除算前のcount:「'+str(count)+'」')
    #print('N='+str(N)+'を「i='+str(i)+'」で割ります。')
    if N%i==0:
        #print('i='+str(i)+'で割り切れたので約数みっけ(=^x^=)')
        count+=1
        #print('count:【'+str(count)+'】')
    #print('------------------------------------')
#print('<<<ループを抜けました。>>>')

#countを出力する
print(count)

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

#Nを標準入力で取り込む
N=int(input())

#約数の個数を格納する変数countを0で初期化する
count=0

#ループでi=1からNまでの範囲で、N%i==0と割り切れた場合にcountをインクリメントする
for i in range(1,N+1):
    if N%i==0:
        count+=1
        
#countを出力する
print(count)

ioの出力結果です。

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに約数の個数を求める整数N:100を入力しました。
黄色いセルには配列の中にあるNの約数の個数を出力します。

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

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

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

2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する


3:整数Nが取得出来たことをログで確認する


4:約数の個数countを0で初期化する


5:ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする


6:ループを抜けてcountをログで出力する


7:二次元配列としてcountを出力する配列count2を宣言する


8:count2に二次元配列になるようにcountを追加する


9:スプレッドシートに出力する前にcount2をログで確認する


10:スプレッドシートの黄色い所にcount2を出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する

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

手順3:整数Nが取得出来たことをログで確認する

console.log(N);

手順4:約数の個数countを0で初期化する

let count=0;

手順5:ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする

i=1の時

N=100をi=1で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=2の時

N=100をi=2で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=3の時

N=100をi=3で割っても割り切れないのでIF文を飛ばします。

i=4の時

N=100をi=4で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=5の時

N=100をi=5で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

以下省略して、割り切れる所を含む部分をトレースします。

i=10〜15の時

N=100をi=10で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=20〜24の時

N=100をi=20で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=21〜24まで割れません。

i=25〜30の時

N=100をi=25で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=26〜30まで割れません。

i=48〜53の時

i=48,49まで割れません。

N=100をi=50で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

i=51〜53まで割れません。

i=96〜100の時

N=100をi=96〜99まで割っても割れません。

N=100をi=100で割ると割り切れるので約数が見つかりました。
countをインクリメントします。

約数の個数が9個になってループを抜けました。
ここまでのトレースのループ部分のコードです。

//ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする
  console.log('<<<ループに入ります。>>>');
  for(let i=1;i<=N;i++){
    console.log(`現在のcount:【${count}】`);
    console.log(`N=${N}を「i=${i}」で割る`);
    if(N%i==0){
      console.log(`約数みっけ(=^x^=) i:「${i}」はN:${N}の約数です。`);
      count++;
      console.log(`約数count:【${count}】個目です。`);
    }
    console.log('--------------------------------------------');
  }
  console.log('<<<ループを抜けました。>>>');

手順6:ループを抜けてcountを出力する

console.log(count);

手順7:二次元配列としてcountを出力する配列count2を宣言する

let count2=[];

手順8:count2に二次元配列になるようにcountを追加する

count2.push([count]);

手順9:スプレッドシートに出力する前にcount2をログで確認する

console.log(count2);

手順10:スプレッドシートの黄色い所にcount2を出力する

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

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

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

function loop2no19(){

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

  //スプレッドシートの緑のセルから整数N(この例の場合は100)を取得する
  const N=ss.getRange(1,2).getValue();

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

  //約数の個数countを0で初期化する
  let count=0;

  //ループ内でIF文を使ってN=100の約数を見つけたらcountをインクリメントする
  console.log('<<<ループに入ります。>>>');
  for(let i=1;i<=N;i++){
    console.log(`現在のcount:【${count}】`);
    console.log(`N=${N}を「i=${i}」で割る`);
    if(N%i==0){
      console.log(`約数みっけ(=^x^=) i:「${i}」はN:${N}の約数です。`);
      count++;
      console.log(`約数count:【${count}】個目です。`);
    }
    console.log('--------------------------------------------');
  }
  console.log('<<<ループを抜けました。>>>');

  //ループを抜けてcountを出力する
  console.log(count);

  //二次元配列としてcountを出力する配列count2を宣言する
  let count2=[];

  //count2に二次元配列になるようにcountを追加する
  count2.push([count]);

  //スプレッドシートに出力する前にcount2をログで確認する
  console.log(count2);

  //スプレッドシートの黄色い所にcount2を出力する
  ss.getRange(3,2).setValue(count2);

}

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

大井競馬場メガイルミ

■ 参考文献の紹介■

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

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

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

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

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

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

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

<ねこフォーム実践編2>プログラミング学習アンケート

この記事では、GAS(Google Apps script)を使って、プログラミング学習者向け(さっき始めたばかりの方から、何十年もやっているベテランの方まで)を対象としたアンケートを作成します。

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

お世話になっているサイトは、いつも隣にITのお仕事さんの

GASでGoogleフォームを一発で作成するツールを作る

です。

まず、下記のような3枚のスプレッドシートを用意します。

・シート「トップ画面」

ここには、ボタンを設置して、このボタンを押すとフォームが作れるようにします。

・シート「フォームのタイトルと説明の情報」

ここには、作成するフォームのタイトルと説明文を入れます。

・シート「項目データ」

ここには、アンケート回答者がラジオボタン、チェックボックス、リストアイテムから選択出来るようスプレッドシートに配置しています。

このデータを二次元配列として取得して、各列ごとに1次元配列に変換して、ラジオボタンなどから選択出来るようにしています。

まず、スプレッドシートのボタンを押すとフォームが作れる関数、「pushButton」を作ります。

function pushButton() {

  //スプレッドシートのトップから現在のスプレッドシートにアクセスする 
  const ss=SpreadsheetApp.getActiveSpreadsheet();
  

  //フォームのタイトルと説明を取得
  const array=ss.getSheetByName('フォームのタイトルと説明の情報').getDataRange().getValues();
  const formTitle=array[0][1];//タイトル
  const formDescription=array[1][1];//概要

  //フォームを指定のタイトルと説明の元、作成する
  const form=FormApp.create(formTitle);  
  form.setDescription(formDescription);
 }

シート「フォームのタイトルと説明の情報」を二次元配列arrayとして取得して、array[0][1]をタイトル、array[1][1]をフォームの説明文として取得しています。

では、いよいよスプレッドシートのシート「項目データ」からデータを取得して、フォームを作成して行きます。

まず、シート「項目データ」を二次元配列として取得するために、下記のコードを書きました。

//項目データからフォームに追加するアイテムの内容を取得
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift()

このコードでは、定数dataValuesにシートを二次元配列として取得したデータを格納して、先頭のタイトル行をshisft()で削除しています。

この二次元配列の各行をフォームのアイテムから選択出来るように一次元配列に変換して、更に空白行を取り除く関数generateArrayを作成しました。

引数に二次元配列のデータとその行を指定して関数generateArrayに送ります。

ここではmapで一次元配列に変換して、filterで空白行を取り除いています。

/**
 * シート「項目データ」全体の値を取得した二次元配列から、指定の列のデータを抜き出し一次元配列を構成する 
 * 
 * @param{Object[][]}シートのデータを二次元配列化とした配列
 * @param{number}配列の列数(0以上のインデックス)
 * @return{Object{}}指定の列(見出しを除く)のデータによる一次元配列
 */
function generateArray(values,column){
  return values.map(record=>record[column]).filter(value=>value);
}

関数呼び出し時には、下記のように指定しました。

A列「性別」は、ラジオボタン(※必須)で、

generateArray(dataValues,0)

と記述し、引数に二次元配列のデータと列数を指定することで「性別」が選択出来ます。

form.addMultipleChoiceItem()    //ラジオボタン
    .setTitle('性別')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);

B列「年齢」の呼び出しは、リストアイテム(※必須)で、

generateArray(dataValues,1)

です。

form.addListItem()              //プルダウン
    .setTitle('ご年齢')
    .setChoiceValues(generateArray(dataValues,1))
    .setRequired(true);

C列「出身在住都道府県」はリストアイテム(※必須)で、

generateArray(dataValues,2)

です。タイトルを変えて2回呼び出すことで、お住まいの都道府県と出身地を入力できます。

form.addListItem()              //プルダウン
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);


  form.addListItem()              //プルダウン
    .setTitle('ご出身の都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);

D列「プログラミング歴」はリストアイテム(※必須)で、

generateArray(dataValues,3)

です。

form.addListItem()              //プルダウン
    .setTitle('プログラミング歴')
    .setChoiceValues(generateArray(dataValues,3))
    .setRequired(true);

E列「学習済み言語・1番得意な言語」はチェックボックスとラジオボタン(※必須)で、タイトルを変えて2回呼び出しています。

generateArray(dataValues,4)

です。

これらもそれぞれ、「その他」を選択出来るようにしています。

form.addCheckboxItem()    //チェックボックス
    .setTitle('学習をしたことのある言語')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

  form.addMultipleChoiceItem()    //ラジオボタン
    .setTitle('1番得意な言語')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

F列「学習のきっかけ」はチェックボックス(※必須)です。

generateArray(dataValues,5)

form.addCheckboxItem()    //チェックボックス
    .setTitle('始めたきっかけ')
    .setChoiceValues(generateArray(dataValues,5))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

G列「学習コンテンツ」はチェックボックス(※必須)です。

generateArray(dataValues,6)

    form.addCheckboxItem()    //チェックボックス
    .setTitle('利用学習コンテンツ')
    .setChoiceValues(generateArray(dataValues,6))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

これ以降は、セミナーの内容が5段階評価で選択出来るようにスケールアイテムを使っています。(※必須)

//スケールアイテム
    form.addScaleItem().setTitle('あなたはどれぐらいプログラミングが好きですか?\n 1:あまり好きではない 〜 5:大好き').setRequired(true);

    form.addScaleItem().setTitle('あなたはどれぐらいプログラミングが得意ですか?\n 1:あまり得意ではない 〜 5:物凄く得意').setRequired(true);

最後は自由に記入できるコメント入力用パラグラフテキストアイテムです。

//長文パラグラフテキストアイテムコメント欄
    form.addParagraphTextItem().setTitle('あなたのおすすめ勉強法やプログラミングの情報を教えて下さい。');

ここまでで実行すると、このようなフォームが作れます。これは目のマークでプレビューを押した画面です。

マイドライブに保存する場合はここまででも良いのですが、指定のドライブに保存したい場合は、プロパティストアというものを使って、フォルダIDをFOLDER_IDという文字列に保存します。

フォルダIDはこちらになります。

このモザイク部分をこちらのコードでXXXが32桁の所に実際のFOLDER_IDに保存します。

//フォームを保存したいドライブのIDを指定して、1番最初に実行する。
function setScriptProperty(){
  PropertiesService.getScriptProperties().setProperty('FOLDER_ID','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}

その実行画面です。

この様に何も起こらないので不安になるかと思います。

そこで、FOLDER_IDに格納出来たのか確認するコードを書きました。

//プロパティストアにフォルダIDが格納されたことを確認する
function getScriptProperty(){
  const folderid=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  console.log(folderid);
}

実行結果です。

あとはメインのpushButton関数にこの4行のコードを追記します。

プロパティストアからFOLDER_IDを取り出して、フォームをそこに格納し、マイドライブに出来てしまったフォームの方は削除します。

//指定のフォルダに保存する。この4行をコメントアウトするとマイドライブ(ルートディレクトリ)に保存される
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//格納するフォルダIDを取り出す
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームをオブジェクトとして取得
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにFileオブジェクトを追加する
  DriveApp.getRootFolder().removeFile(formFile);//マイフォルダからFileオブジェクトを削除する

コメントにもある様、マイドライブ(ルードディレクトリ)に保存したい場合は、一旦コメントアウトをしておいても状況に寄っては宜しいかもしれません。

ここまでの説明で、もう少し詳しくプロパティストアについて知りたいという方は、

<ねこフォーム2>GASで作成したフォームを指定のフォルダに格納する

をご覧ください。

では、これまでのコードをまとめます。

/**
 * シート「項目データ」全体の値を取得した二次元配列から、指定の列のデータを抜き出し一次元配列を構成する 
 * 
 * @param{Object[][]}シートのデータを二次元配列化とした配列
 * @param{number}配列の列数(0以上のインデックス)
 * @return{Object{}}指定の列(見出しを除く)のデータによる一次元配列
 */
function generateArray(values,column){
  return values.map(record=>record[column]).filter(value=>value);
}


function pushButton() {

  //スプレッドシートのトップから現在のスプレッドシートにアクセスする 
  const ss=SpreadsheetApp.getActiveSpreadsheet();
  

  //フォームのタイトルと説明を取得
  const array=ss.getSheetByName('フォームのタイトルと説明の情報').getDataRange().getValues();
  const formTitle=array[0][1];//タイトル
  const formDescription=array[1][1];//概要

  
  //フォームを指定のタイトルと説明の元、作成する
  const form=FormApp.create(formTitle);  
  form.setDescription(formDescription);
 

 //項目データからフォームに追加するアイテムの内容を取得
  const dataValues=ss.getSheetByName('項目データ').getDataRange().getValues();
  dataValues.shift()

 
  form.addMultipleChoiceItem()    //ラジオボタン
    .setTitle('性別')
    .setChoiceValues(generateArray(dataValues,0))
    .setRequired(true);

  form.addListItem()              //プルダウン
    .setTitle('ご年齢')
    .setChoiceValues(generateArray(dataValues,1))
    .setRequired(true);

  form.addListItem()              //プルダウン
    .setTitle('お住まいの都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);


  form.addListItem()              //プルダウン
    .setTitle('ご出身の都道府県は?')
    .setChoiceValues(generateArray(dataValues,2))
    .setRequired(true);

  
  form.addListItem()              //プルダウン
    .setTitle('プログラミング歴')
    .setChoiceValues(generateArray(dataValues,3))
    .setRequired(true);


  form.addCheckboxItem()    //チェックボックス
    .setTitle('学習をしたことのある言語')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

  form.addMultipleChoiceItem()    //ラジオボタン
    .setTitle('1番得意な言語')
    .setChoiceValues(generateArray(dataValues,4))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);


    form.addCheckboxItem()    //チェックボックス
    .setTitle('始めたきっかけ')
    .setChoiceValues(generateArray(dataValues,5))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);



    form.addCheckboxItem()    //チェックボックス
    .setTitle('利用学習コンテンツ')
    .setChoiceValues(generateArray(dataValues,6))
    .showOtherOption(true)//その他の選択肢
    .setRequired(true);

    //スケールアイテム
    form.addScaleItem().setTitle('あなたはどれぐらいプログラミングが好きですか?\n 1:あまり好きではない 〜 5:大好き').setRequired(true);

    form.addScaleItem().setTitle('あなたはどれぐらいプログラミングが得意ですか?\n 1:あまり得意ではない 〜 5:物凄く得意').setRequired(true);


    //長文パラグラフテキストアイテムコメント欄
    form.addParagraphTextItem().setTitle('あなたのおすすめ勉強法やプログラミングの情報を教えて下さい。');
  

  //指定のフォルダに保存する。この4行をコメントアウトするとマイドライブ(ルートディレクトリ)に保存される
  const id=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');//格納するフォルダIDを取り出す
  const formFile=DriveApp.getFileById(form.getId());//作成したフォームをオブジェクトとして取得
  DriveApp.getFolderById(id).addFile(formFile);//指定のフォルダにFileオブジェクトを追加する
  DriveApp.getRootFolder().removeFile(formFile);//マイフォルダからFileオブジェクトを削除する


}


//フォームを保存したいドライブのIDを指定して、1番最初に実行する。
function setScriptProperty(){
  PropertiesService.getScriptProperties().setProperty('FOLDER_ID','XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
}


//プロパティストアにフォルダIDが格納されたことを確認する
function getScriptProperty(){
  const folderid=PropertiesService.getScriptProperties().getProperty('FOLDER_ID');
  console.log(folderid);
}

あとはスプレッドシートのトップ画面のボタンの右上3点リーダーからスクリプトを「pushButton」に割り当てて押すと、あなたが指定したフォルダ、またはマイドライブに保存されます。

お疲れ様でした、ブレイクタイムフォトはこちらになります。

東京都葛飾区にある新緑の水元公園。コロナ前2018年のゴールデンウィークにサイクリングに行きました。

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

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

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

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

←ねこフォーム実践編1(セミナーアンケート)に戻る

ねこフォーム実践編3(就職氷河期世代&大人の発達障害読者アンケートに進む)→

paiza レベルアップ問題集 「STEP: 13 1 はどこにある?」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASでforループとループの中で単純なIF文を使ってリスト(配列)の中で指定の数がある位置を求めることができるようになります。

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

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

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

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

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

1 はどこにある? (paizaランク D 相当)

問題:
N 個の整数 a_1, a_2, …, a_N が与えられます。
a_1, a_2, …, a_N のうち、1 がある位置を先頭から順に改行区切りで出力してください。
a_1 を 1 番目とし、a_1, a_2, …, a_N には少なくとも 1 個は 1 が含まれます。

この記事では、下記の入力例2の場合を例にして、標準入力でリストの要素数N=5とリストを取得した後にリストarrayを取得し、その中に1が含まれている位置を出力します。リスト(配列)の先頭は0から始まります。下記の例では、リストの添字0と4が求まるので、それらに1を加えた1と5を出力するようにコードを書いて行きます。

入力例2
5
1 5 5 5 1

出力例2
1
5

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

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

■ Pythonでの解き方 ■

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

手順として、

1:Nを標準入力で取り込む

2:リストarrayを標準入力で取り込む


3:ループでリストarray[i]の中身を調べ、IF文でarray[i]==1の時に「i+1」を出力する

で、行います。

リストの添字は0から始まる為、「i+1」と1を加えています。

では、ループのトレースを行います。

i=0の時

array[0]=1でリストの中身が1の条件に該当するので、i=0に1を加えた「1」を出力します。

i=1の時

array[1]=5で条件に該当しないのでIF文は飛ばします。

i=2の時

array[2]=5で条件に該当しないのでIF文は飛ばします。

i=3の時

array[3]=5で条件に該当しないのでIF文は飛ばします。

i=4の時

array[4]=1でリストの中身が1の条件に該当するので、i=4に1を加えた「5」を出力します。

ここまでのトレースのコードです。

#Nを標準入力で取り込む
N=int(input())

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

#ループでリストarray[i]の中身を調べ、IF文でarray[i]==1の時に「i+1」を出力する
print('<<<ループに入ります>>>')
for i in range(N):
    print('array['+str(i)+']の中身は「'+str(array[i])+'」です。')
    if array[i]==1:
        print('1見っけ!! i+1=【'+str(i+1)+'】を出力します')
        print(i+1)
    print('------------------')
print('<<<ループを抜けました。>>>')    

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

#Nを標準入力で取り込む
N=int(input())

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

#ループでリストarray[i]の中身を調べ、IF文でarray[i]==1の時に「i+1」を出力する
#print('<<<ループに入ります>>>')
for i in range(N):
    #print('array['+str(i)+']の中身は「'+str(array[i])+'」です。')
    if array[i]==1:
        #print('1見っけ!! i+1=【'+str(i+1)+'】を出力します')
        print(i+1)
    #print('------------------')
#print('<<<ループを抜けました。>>>')    

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

#Nを標準入力で取り込む
N=int(input())

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

#ループでリストarray[i]の中身を調べ、IF文でarray[i]==1の時に「i+1」を出力する
for i in range(N):
    if array[i]==1:
        print(i+1)

■ GASでの解き方 ■

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

スプレッドシートの緑のセルに配列の数の整数5を入力しました。
灰色のセルには配列を入力しました。
黄色いセルには配列の中にある「1」を見つけたらその場所がどこにあるのか出力します。配列の添字は0から始まるため、出力する値は「i+1」です。

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

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

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

2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する


3:スプレッドシートの灰色のセルから配列arrayを取得する


4:配列arrayが取得出来たことを確認するために出力する


5:配列arrayの中に1を見つけたらその位置「i+1」を格納する配列oneを宣言する


6:ループ内でarray[0][i]の値が「1」の場合は、その位置「i+1」がoneに二次元配列になるように追加する


7:ループを抜けてスプレッドシートに出力前の二次元配列oneをログ出力して確認する


8:スプレッドシートの黄色い所に配列arrayの中に含まれている1の位置が格納された二次元配列oneを出力する

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

const ss=SpreadsheetApp.getActiveSheet();

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

手順2:スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する

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

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

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

手順4:配列が取得出来たことを確認するために出力する

console.log(array);

手順5:配列arrayの中に1を見つけたらその位置「i+1」を格納する配列oneを宣言する

let one=[];

手順6:ループ内でarray[0][i]の値が「1」の場合は、その位置「i+1」がoneに二次元配列になるように追加する。
スプレッドシートでは二次元配列として取得されるので、array[0][i]と書いています。
また、配列は添字が0から始まるので「i+1」をしています。

i=0の時

array[0][0]=1でリストの中身が1の条件に該当するので、i=0に1を加えた「1」を出力します。

i=1の時

array[0][1]=5で条件に該当しないのでIF文は飛ばします。

i=2の時

array[0][2]=5で条件に該当しないのでIF文は飛ばします。

i=3の時

array[0][3]=5で条件に該当しないのでIF文は飛ばします。

i=4の時

array[0][4]=1でリストの中身が1の条件に該当するので、i=4に1を加えた「5」を出力します。

ここまでを踏まえて、ループの部分のコードを掲載します。

//ループ内でarray[0][i]の値が「1」の場合は、その位置「i+1」がoneに二次元配列になるように追加する
  console.log('<<<ループに入ります。>>>');
  for(let i=0;i<N;i++){
    console.log(`現在の配列one:[[${one}]]`);
    console.log(`i:${i}の時、配列では先頭から${i+1}番目でarray[0][${i}]=${array[0][i]}`);
    if(array[0][i]==1){
      console.log(`1見っけ(=^x^=)!! 配列oneに【${i+1}】を追加`);
      one.push([i+1]);
      console.log(one);
    }
    console.log('------------------------------------------------');
  }
  console.log('<<<ループを抜けました。>>>');

手順7:ループを抜けてスプレッドシートに出力前の二次元配列oneをログ出力して確認する

console.log(one);

手順8:スプレッドシートの黄色い所に配列arrayの中に含まれている1の位置が格納された二次元配列oneを出力する

ss.getRange(4,2,one.length).setValues(one);

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

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

function loop2no18(){

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

  //スプレッドシートの緑のセルから整数N(この例の場合は5)を取得する
  const N=ss.getRange(1,2).getValue();

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

  //配列arrayが取得出来たことを確認するために出力する
  console.log(array);

  //配列arrayの中に1を見つけたらその位置「i+1」を格納する配列oneを宣言する
  let one=[];

  //ループ内でarray[0][i]の値が「1」の場合は、その位置「i+1」がoneに二次元配列になるように追加する
  console.log('<<<ループに入ります。>>>');
  for(let i=0;i<N;i++){
    console.log(`現在の配列one:[[${one}]]`);
    console.log(`i:${i}の時、配列では先頭から${i+1}番目でarray[0][${i}]=${array[0][i]}`);
    if(array[0][i]==1){
      console.log(`1見っけ(=^x^=)!! 配列oneに【${i+1}】を追加`);
      one.push([i+1]);
      console.log(one);
    }
    console.log('------------------------------------------------');
  }
  console.log('<<<ループを抜けました。>>>');

  //ループを抜けてスプレッドシートに出力前の二次元配列oneをログ出力して確認する
  console.log(one);


  //スプレッドシートの黄色い所に配列arrayの中に含まれている1の位置が格納された二次元配列oneを出力する
  ss.getRange(4,2,one.length).setValues(one);

}

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

大井競馬場メガイルミの噴水

■ 参考文献の紹介■

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

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

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

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

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

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