【ピボットテーブル】スプレッドシートの例

この記事では、フリーのサンプルデータを使って、スプレッドシートで簡単にピボットテーブルを作成する方法を掲載しております。

下記のピボットテーブルのサンプルデータについては、こちらのリンクの記事をご参照の上、ご用意をお願い致します。

現在、スプレッドシートでこの様な画面になっていることを前提として進めさせて頂きます。

[挿入]タブを選択して、ピボットテーブルをクリックします。

範囲が「’シート1′!A1:H16」になっていることを確認して、「新しいシート」選択して、作成を押します。

「行」の右にある「追加」ボタンを押して、「取引先名」をクリックすると、

この様な表が簡単に作れました。

同じように、

列:商品名
値:売上金額

を選ぶと、こんな感じになります。

ピボットテーブルは自由にカスタマイズできるので、行の取引先名を別の項目にすることも可能です。

例えば、取引先名を×で消して、

代わりに入荷日を選択すると、この様になりました。

「フィルタ」に「取引先名」をクリックして追加します。

現在は、すべての取引先名の合計が表示されていますが、この「すべての項目を表示して…」をクリックして、クリアを選択してから「金城さん」などのお好きな名前をクリックすると、

金城さんが買った分だけが表示されます。

こちらが先程まであった、全員分の表です。

一旦、フィルタの所を全員分の名前が表示される様にして

「列」の所にある「商品名」を上に向かって「行」の所にドラッグして、「入荷日を×」にすると、

この様な商品名ごとの売上金額の表が出来ました。
(列幅を広げた状態です。)

この様に、自分の見たいカットで見ることが出来ました。

他にも、商品名を降順にすることや、

現在は値の売上金額がSUMになっているので、

金額が362500円になっていますが、集計をMAXにすると、

金額も、最大値の金額が表示されました。

この記事では省略しますが、売上金額をMINにすると総計が3000になります。


以上、ざっくりですが、スプレッドシートでのピボットテーブルの概要が掴めたと思います。

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

お台場のレインボーブリッジと、小さく見える東京タワーです。


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

スプレッドシートのオススメ本を紹介いたします。

単行本(ソフトカバー)
Kindle版

殆ど障害者雇用や発達障害の悩みについての内容ですが、厳選してスプレッドシートやExcel等の「障害者雇用のお仕事で特に役に立ったショートカットキー」についても掲載しております。

Kindle版



初めてのスプレッドシートに戻る
写真クリエイターとしての活動


自己紹介

COUNTIFS関数で、のび太とジャイアンの忘れ物を集計する

この記事を読むことで、

・国民的アニメ「ドラえもん」を使って「COUNTIFS関数」を習得

・その例として「のび太とジャイアンの忘れ物」を集計

・「絶対参照」・「複合参照」・「相対参照」の違いと使い方の理解

についての概要をつかめます。
まず、下記のような簡易的な表を用意します。

忘れ物は、全部で9件ですね。

セルのE1の所に、のび太の忘れ物の件数を数える為に、COUNTIFS関数を入力します。最初に、式の意味をお伝えします。

=COUNTIFS(キャラ名の範囲 , のび太)

具体的な式の設定は、下記の様になります。
キャラ名の範囲を絶対参照にすることで、後でジャイアンの忘れ物の件数を数える時に便利になります。

=COUNTIFS($A$2:$A$10,D1)

$マークは絶対参照で、ショートカットキー「F4キー」を押すと簡単に$マークを出せます。(ノートPCによっては、[Fn]キーも一緒に、「Fn+F4」と押して見て下さい。)

のび太の忘れ物は7件でしたね。
実際に、A列で「のび太」と数えると、2, 3, 4, 6, 7, 9, 10行目で7件です。

この表はデータ数が少ないから目視でも数えられますが、大量のデータだと数えるのも大変なので、関数の恩恵に感謝です。


このE1のセルをそのままジャイアンの所に下に引っ張っていくと、

ジャイアンの忘れ物が5,8行目で2件と求まりました。
名前のA列を絶対参照で固定しているので、そのまま引っ張るだけで求められました。

ちなみに、COUNTIFS関数ではなく、COUNTIF関数でも求めらます。
しかし、今回COUNTIFSを使ったのは、次の表の集計の準備の為です。

ジャイアンの忘れ物件数の所のオートフィルでは、書式なしコピーもすることが可能です。

このオートフィルオプション、用が終わったら結構邪魔ですよね。

そこで、範囲外の任意の空白セル、例えばセルE4などの所で、「スペースキー」を入力して、その後スペースキーで入力した空白を消します。(そのスペースキーを押して出来た空白は、削除してもしなくてもOKです。)


次はCOUNTIFS関数の本領を発揮した例に致します。

上記の「のび太」と「ジャイアン」の忘れ物について、「誰」が「何」を「どれだけ」忘れたのかを集計するので、下記のようなマトリックスの表を簡単で良いので用意します。

セルE6に集計する式を入力しますので、まずは数式の意味から掲載致します。

=COUNTIFS
(A列のキャラ名の範囲 , D列のび太 , B列の忘れ物の範囲 ,5行目の教科書 )

で、絶対参照だけでなく、複合参照も使うので、この部分については、

・A列のキャラ名の範囲 ……… [絶対参照]

・D列のび太 …………………… [列] 固定の複合参照

・B列の忘れ物の範囲 ……… [絶対参照]

・5行目の教科書 ……………… [行] 固定の複合参照

となり、セルE6に入力する具体的な数式は、

=COUNTIFS
($A$2:$A$10,$D6,$B$2:$B$10,E$5)

となります。

[F4]を

1回押すと絶対参照
2回で行固定の複合参照
3回で列固定の複合参照
4回で相対参照

に戻ります。

ちょっとややこしいですね。
理解するまで何度も学習したのでそれが面倒でしたが、最初のセルE6のみ式に絶対参照・複合参照を設定すると、式をコピーするだけでCOUNTIFS関数が正しく機能するのでラクなんです!!

それではここで設定した式を、ジャイアンの教科書に反映させますので、セルE7を選択します。

その状態で ショートカットキー [Ctrl] + [D]でジャイアンの教科書の忘れ物の数式が入力出来ます。

これで、本当にジャイアンの教科書の忘れ物がカウントされているのか調べるには、このセルE7を選択している状態で[Ctrl] キーを押しながら [ [ (カッコの始まり。@キーの右隣) ]を押してみて下さい。

無事にジャイアンの教科書の忘れ物を正しく参照していることを確認出来ました。

では、ノートやランドセルの列までフィルします。
まずはこのように選択して下さい。

このまま[Shift]+[ → ] キーでランドセルの列まで選択範囲を右に広げてから
[Ctrl] + [R] を押します。

この数字、本当に合っているのか不安になった場合、忘れ物は全部で9件ですので、上の図の様に数値を選択した状態で合計を確認します。
やり方はとても簡単で、そのままExcelの画面の右下を見るだけです。

これで一安心ですね。

のび太はランドセルを4回も忘れているなんて、流石です(笑)
ジャイアンの方が忘れ物が少ないのは、のび太よりかは出来るからかのか、
「お前のものは俺のもの!!、俺のものは俺のもの!!」の精神から来ているのでしょうか。


このブログの読者様はご存知のことだと思いますが、私には発達障害があり、忘れ物が多すぎて悩んでいました。

実は、のび太とジャイアンにも発達障害があるのでは、という記事を見つけましたので興味のある方はご覧下さい。

ADHD(注意欠如・多動性障害) | のび太・ジャイアン症候群

私自身の困りごとについて忘れ物以外の内容ですが動画にまとめました。

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

「できるYouTuber式 Excel現場の教科書(長内孝平氏)」

単行本(ソフトカバー)
Kindle版


「なんの才能もない発達障害者の声: 〜 届かない声を届けたい 〜 (障害者雇用向け)」

私、猫★シエスタの著作です。殆どが「発達障害者として働くことや障害とSNSについて」ですが、障害者雇用の事務作業で特に使用頻度の高いキーに絞ったExcelなどのショートカットキーの紹介と、演習問題も掲載しております。
Kindle版


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

遊歩道を咲き誇る桜です。
花鳥風月の順に人は感動するようで、私はまだ「花」の状態です。

「取りあえず事務職で働きたいから手っ取り早くExcel教えてくれ」に戻る

初めてのGoogleスプレッドシートへ



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

paiza レベルアップ問題集 標準入力その7「STEP: 3 1 行目で与えられる N 個の文字列の入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonで標準入力とsplitなどのメソッドを用いて、5つの単語の数(数値)と、全ての単語(文字列)をリスト(配列)として取得して、単語のみをループ内で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

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

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

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

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


1 行目で与えられる N 個の文字列の入力 (paizaランク D 相当)

問題:
1 行目で、整数 N と、続けて N 個の文字列 s_1, … , s_N が半角スペース区切りで与えられます。
s_1, … , s_N を改行区切りで出力してください。

入力例1
5 paiza 813 paiza813 Hello World!


出力例1
paiza
813
paiza813
Hello
World!

今回は入出力例1を用います。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目の単語の個数5と、5つの単語を標準入力でリスト(配列)arrayに取得する

2: 単語の個数5個の5を変数Nに、N=int(array[0])と数値形式で代入する


3: リストarrayに対し、delメソッドでNに代入した5を消去する

4: リストに残った単語をループで出力する

・基本的なループ
・リスト出力に適したループ
・上記の内包表記

の4ステップで行います。

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

次にこの1行をリスト(配列)として下記のメソッドなどを用いて取得します。

区切り文字は半角スペースで、リストarrayに標準入力を用いて取得します。
複数のメソッドなどが登場しているので、この例に沿って役割をまとめます。

input … 標準入力で文字や数値を取得する

split … 半角スペースなどの指定の区切り文字で分割して取得する

str … 上記で取得する対象が単語(文字列)である


map … まとめて適用


list … リスト(配列)変換

下記のコードで標準入力と入力とリストarrayの出力を行います。

#1行目の単語の個数5個と単語を標準入力でリストarrayに取得する
array=list(map(str,input().split(' ')))

#リストとして取得できたことを確認する
print(array)

単語の個数5個も含めて、無事にarrayに標準入力で取得出来たことが確認出来ました。


単語の個数である「5」は出力しないので、変数「N」に整数として代入します。

N=int(array[0])

下記のコードと出力結果です。

array=list(map(str,input().split(' ')))
print(array)

#変数Nにリストの先頭から単語の個数5を代入する
N=int(array[0])

#Nに5が代入されたことを確認する
print(N)

次に、Nに代入済みのリストarrayの先頭array[0]の5を削除します。

del array[0]

コードと実行結果です。

array=list(map(str,input().split(' ')))
print(array)


N=int(array[0])
print(N)

#リストarrayから変数Nに代入した5を削除する
del array[0]

#削除されたことを確認する
print(array)

元のリストから無事に先頭の5だけが削除されたことが確認出来ました。


それでは、残ったリストarrayを最も基本的なループを用いて縦に出力致します。

現在、リストarrayには、

array[0]=paiza
array[1]=813
array[2]=paiza813
array[3]=Hello
array[4]=world!

の5つの単語が入っています。

ループの書式は下記の様になります。

for i in range(N):

現在Nには5が入っています。

ループで出力する時に、iの値はrange(N)で5未満の、i=0,1,2,3,4の5つの値が代入され、ループを5回分回しながら単語の出力をします。

array=list(map(str,input().split(' ')))
#print(array) ←コメントアウト

N=int(array[0])
#print(N) ←コメントアウト

del array[0]
#print(array)  ←コメントアウト

#最も基本的なループ
for i in range(N):
    print(array[i])

確認用に出力した所はコメントアウトして、基本的なループのみを出力します。

無事出力出来ました。

次項からは、リストに適したループの便利な記述を掲載します。
その前に、一旦コメントアウトしたコードを削除してスッキリとしたコードに致します。

array=list(map(str,input().split(' ')))
N=int(array[0])
del array[0]


#最も基本的なループ
for i in range(N):
    print(array[i])

リストを出力する際に、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for word in array:

等になります。

リストの要素の所は自分や他の方が見て分かりやすい「word」などにすると、「単語を取り出すんだな」と伝わりやすいです。

array=list(map(str,input().split(' ')))
N=int(array[0])
del array[0]


#arrayをリストに適したループで出力する
for word in array:
    print(word)

基本的なループと同じ出力結果を得られました。


更にコード短くするには、ループをたった1行で表記する内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(word) for word in array]

と表記致します。

array=list(map(str,input().split(' ')))
N=int(array[0])
del array[0]


#リストarrayを内包表記で出力する
[print(word) for word in array]

Pythonは以上です。
次は、GASで解いて行きます。


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

5つの単語の出力用の黄色いセルは、右揃えにしてあります。

paiza側でコピーをして、スプレッドシートのセル緑のセルA2の所で貼り付ける際に、[Ctrl] + [Shif] + [V] で貼り付けると、書式を崩さずに綺麗に貼り付けられます。

緑色のセルA2(2,1)には、単語の個数5個と、N個の単語がを入力されています。

この緑色のセルを配列arrayに取得をして、N=array[0]と代入した後に、先頭の5を配列arrayから削除します。

残ったarrayをC2から始まる黄色いセル5行分に出力します。

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

空の配列array2を宣言して、ループを用いてループの中でpushメソッドを使用して、arrayの要素を二次元配列になるようにarray2に追加します。
その二次元配列になったarray2をスプレッドシートに出力します。

手順をまとめますと、この様になります。

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

2: 緑色のセルA2(2,1)をsplitメソッドを用いて配列arrayに取得する


3: 配列arrayをログ出力する


4: 単語の数5を変数Nに、N=array[0]と代入する


5: shiftメソッドでNに代入した最初の単語の数の5を削除する


6: 空の配列array2を宣言して、一次元配列arrayをループの中でpushを使ってarray2に二次元配列として追加する

7: スプレッドシートに出力する前に、二次元配列になっていることを配列array2をログ出力する


8:スプレッドシートのセルC2(2,3)から始まる黄色いセル5行分に出力する

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

const ss = SpreadsheetApp.getActiveSheet();

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

このコードを関数「standardInput3」の中に書いて行きます。

Standard Inputで標準入力の意味です。

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

}


手順2:緑色のセルA2(2,1)をsplitメソッドを用いてarrayに取得する

const array=ss.getRange(2,1).getValue().split(‘ ‘);

ここで、半角スペースで区切られている単語を配列arrayに取得するのにsplit(‘ ‘)を用いいています。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA2(2,1)をsplitメソッドで半角スペース区切りにして配列arrayに取得する
  const array=ss.getRange(2,1).getValue().split(' ');

}


手順3:配列arrayをログ出力

console.log(array);

配列に取得出来たことを確認します。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  //配列arrayに半角スペース区切りで格納出来たことをログ出力で確認する
  console.log(array);

}

出力結果です。

無事にarrayに単語の個数と単語自体を格納出来ました。


手順4:文字列の数NをN=array[0]と代入する

const N=array[0];

出力に使わない単語の文字数の5は、定数Nに代入します。
コードと実行結果です。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  //単語数5を定数Nに代入する
  const N=array[0];

  //Nに代入出来たことを確認する
  console.log(N);

}

配列の先頭array[0]がNに無事に代入されました。


手順5: shiftメソッドでNに代入した最初の単語の数の5を削除する

array.shift();

出力するのは単語のみですので、配列arrayから先頭のarray[0]の5を削除します。
現在配列arrayは、

array[0]=5
array[1]=paiza
array[2]=813
array[3]=paiza813
array[4]=Hello
array[5]=World!

の0から5までの6つの要素が入っています。
これを下記のコードでarray[0]のみを削除するのに便利なのがshiftメソッドです。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  //shiftメソッドで配列arrayの先頭の単語数の5を削除する
  array.shift();

  //削除後の配列arrayを表示する
  console.log(array);

}

実行後のログ出力です。

配列arrayから先頭の5が削除され、出力する単語のみが残りました。


手順6:空の配列array2を宣言して、一次元配列arrayをループの中でpushを使ってarray2に二次元配列として追加する

for(let i=0 ; i<N ; i++)

定数Nには5が代入されていて、現在配列arrayは、

array[0]=paiza
array[1]=813
array[2]=paiza813
array[3]=Hello
array[4]=World!

の5つの単語が格納されています。
ここで、ループの中の変数iをletで配列の添字として宣言して、i=0,1,2,3,4と5回分ループを回します。

i<Nと不等号のみで等号がついていないのは、一番後ろの要素がarray[4]=World!で、5未満の添字になるためです。

空の配列array2を宣言し、下記の書式で二次元配列として追加します。

array2.push([array[i]]);

pushメソッドを使って、配列array2にarrayの要素を追加します。
[array[i]]と[ ] で括っているのは、二次元配列として追加する為です。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  //空の配列array2を宣言
  const array2=[];

  //ループで二次元配列としてarray2にarrayの要素を追加する
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }
}

手順7:スプレッドシートに出力する前に、二次元配列になっていることを配列array2をログ出力する

console.log(array2);

下記のコードで二次元配列になっていることが確認出来ます。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  const array2=[];
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

  //スプレッドシート出力前にarray2が二次元配列になっていることを確認する
  console.log(array2);

}

これで、スプレッドシートに格納出来る形に整いました。


手順8:スプレッドシートのセルC2(2,3)から始まる黄色いセル5行分に出力する

C2が(2,3)で、そこから5行分の単語を出力するので(2,3,N)となります。
1列分も含めた(2,3,N,1)について、1列の場合は列の指定は省略が可能です。

ss.getRange(2,3,N).setValues(array2);

setValuesとsが付いているのは、出力する単語の数が5個と複数形になるからです。
コードと実行後のスプレッドシートです。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  const array2=[];
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

  console.log(array2);


  //スプレッドシートのC2(2,3)から始まる黄色いセルの範囲にN(=5)行分出力する
  ss.getRange(2,3,N).setValues(array2);

}

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python mapの使い方
Python delの使い方


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

2024年いたばし花火大会です。

←前の問題へ          ループ1の1へ→

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

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

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

■ 関連記事 ■

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


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

paiza レベルアップ問題集 標準入力その7「STEP: 2 2 行目で与えられる N 個の文字列の入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonでinputやsplitメソッド等を用いて、半角区切りの単語をリスト(配列)形式で標準入力を使って取得し、ループで出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

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

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

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

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


2 行目で与えられる N 個の文字列の入力 (paizaランク D 相当)

問題:
1 行目に整数 N が与えられます。
2 行目に、N 個の文字列 s_1, … , s_N が半角スペース区切りで与えられます。
s_1, … , s_N を改行区切りで出力してください。

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


手順として、

1: 1行目の単語(文字列)の数5個を変数Nに標準入力で整数として取得する

2: 2行目の半角スペース区切りの単語を標準入力と単語の区切り位置(半角スペース)分割を使ってリスト(配列)arrayに格納する


3: リストarrayをループで出力する
・基本的なループ
・リスト出力に適したループ
・上記の内包表記

の3ステップで行います。

今回は入出力例1を用います。

入力例1
5
paiza 813 paiza813 hello813 good

出力例1
paiza
813
paiza813
hello813
good

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

問題集の入力例を貼り付けた画像

まず1行目の文字の数の5を標準入力で取得して変数Nに入力します。

N=int(input())

intの中に標準入力で取得するinputを入れると、数値を対象とした取得が可能になります。

#1行目の文字列の個数Nを標準入力で整数として取得する
N=int(input())

#Nに5が代入されたことを確認する
print(N)

下記の画像よりN=5が無事に取得出来ました。

単語の数が取得出来た出力結果の画像

次に2行目の文字列を半角区切りのリスト(配列)arrayに代入します。
複数のメソッドなどが登場しているので、この例に沿って役割をまとめます。

input … 標準入力で文字や数値を取得する

split … 半角スペースなどの指定の区切り文字で分割して取得する

str … 上記で取得する対象が単語(文字列)である


map … まとめて適用


list … リスト(配列)変換

このコードの実行結果です。
数値の個数5を含めた整数1行分がリストarrayとして出力されました。

#1行目の文字列の個数Nを標準入力で整数として取得する
N=int(input())

#Nに5が代入されたことを確認する
print(N)

#2行目の半角スペース区切りの文字列をリストarrayに格納する
array=list(map(str,input().split((' '))))

#arrayをリストの形に標準入力を用いて取得出来たことを確認
print(array)
配列で単語が取得出来きた画像

無事にリストとして格納されたことが確認出来ました。


では、リストの残ったarrayをループを用いて解答の出力例に沿って縦に出力します。
最も基礎的なループでは、この様な解説とコードになります。

for i in range(N):

ループの中では、iの値が0,1,2,3,4の5つ、1つずつ増えて行きます。
リストの添字は0から始まり、N=5ですのでarray[i]は、

array[0]=paiza
array[1]=813
array[2]=paiza813
array[3]=hello813
array[4]=
good

の5つの値が取得出来ます。

#1行目の文字列の個数Nを標準入力で整数として取得する
N=int(input())

#Nに5が代入されたことを確認する
#print(N) ← コメントアウト

#2行目の半角スペース区切りの文字列をリストarrayに格納する
array=list(map(str,input().split((' '))))

#arrayをリストの形に標準入力を用いて取得出来たことを確認
#print(array) ← コメントアウト

#基本的なループ
for i in range(N):
    print(array[i])

出力結果です。

単語のループを用いた出力結果の画像

次の少しだけ応用編(シンプルになるだけですので、大丈夫です)のループの出力に備えて、コメントアウトした分のコードを削除します。

#1行目の文字列の個数Nを標準入力で整数として取得する
N=int(input())

#2行目の半角スペース区切りの文字列をリストarrayに格納する
array=list(map(str,input().split((' '))))


#基本的なループ
for i in range(N):
    print(array[i])

確認用に出力したコメントアウトの部分を削除したスッキリしたコードになりました。


次に、リストを出力する際に、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for word in array:

等になります。

リストの要素の所は自分や他の方が見て分かりやすい「word」などにすると、「単語を取り出すんだな」と伝わりやすいです。

N=int(input())

array=list(map(str,input().split((' '))))


#arrayをリストに適したループで出力する
for word in array:
    print(word)

ループ以外のコメントを消しました。
少しだけシンプルなコードで同じ出力結果が得られました。


更にコード短くするには、ループをたった1行で表記する内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(word) for word in array]

と表記致します。

N=int(input())

array=list(map(str,input().split((' '))))

#リストarrayを内包表記で出力する
[print(word) for word in array]

Pythonは以上です。
次は、GASで解いて行きます。


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

paiza側で入力例1をコピーして、スプレッドシート側ではショートカットキー、[Ctrl] + [Shift] + [V] で貼り付けると、元の書式を保って貼り付けられます。

スプレッドシートの初期状態の数値や文字列(単語5つ)

出力するC列の黄色いセルの部分は、左揃えにしました。

緑色のセルA1に単語(文字列)の個数の5、灰色の所に出力するN個の単語が入力されています。

スプレッドシートのアクセス回数を減らすために、この緑色の単語の個数と灰色の単語を同時に配列arrayで取得し、5個の単語のみをC2から始まる黄色いセルに出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

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

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

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

2: 緑色のセルとA1灰色と灰色のセルA2を同時に配列arrayに取得して二次元配列になっていることをログで確認する


3: 5つの単語(文字列)の数を変数Nとして、N=array[0][0]と代入する


4: Nに代入した配列arrayの先頭array[0][0]をshiftメソッドで削除する

5: 残りの単語の部分を新たな配列array2にarray2=array[0][0].split(‘ ‘)と単語ごとに分割する

6: array2が単語ごとに分割は出来ても一次元配列になってしまったので、スプレッドシート出力前に新たな配列array3にmapを用いて二次元配列に変換する

7: array3をスプレッドシートのC2(3,2)から始まる黄色いセルに出力する


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

const ss = SpreadsheetApp.getActiveSheet();

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

このコードを関数「standardInput2」に書いていきます。

Standard Inputで標準入力の意味です。

function standardInput2() {

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

}


手順2:緑色のセルA1と灰色のセルA2をまとめて配列arrayに取得する

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

セルA1は(1,1)で2行分ですので、(1,1,2)になります。
列数の1列分も含めると(1,1,2,1)になりますが、1列の場合は省略できます。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA1(1,1)と灰色のセルの2行分を配列arrayに取得する
  const array=ss.getRange(1,1,2).getValues();

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

}

また、このコードの実行結果より、この配列が二次元配列として取得出来たことを確認します。

Google Apps Scriptで、文字数と単語の二次元配列の出力結果

この画像より、

array[0][0]=5
array[1][0]=出力する5つの単語

の二次元配列になっております。


手順3:配列先頭である単語の数5個を変数Nに代入して、N=array[0][0]として取得する

const N=array[0][0];

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  //単語(文字列)の数の5個をN=array[0][0]として取得する
  const N=array[0][0];

  //変数Nに5が代入されたことをログで確認する
  console.log(N);

}

先頭の単語の数5個をNに代入する。


手順4:変数Nに代入した配列arrayの先頭「5」をshiftメソッドで削除する

先頭の要素のみ削除するメソッドのshiftは今回のコードでは

array.shift();

この様に使用します。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const N=array[0][0];
  console.log(N);

  //Nに代入した配列arrayの先頭の要素を削除する
  array.shift();

  //配列の先頭が削除されたことを確認する
  console.log(array);  

}

先頭の単語の個数5が削除出来た結果の画像


手順5:配列array2に残りのarrayの単語の部分をarray2=area[0][0].split(‘ ‘)として取得する

const array2=array[0][0].split(‘ ‘);

現在、配列arrayはスペースで区切られている一つの文字列になっています。
これをsplitメソッドを用いて分割して5つの単語にします。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const N=array[0][0];
  console.log(N);

  array.shift();
  console.log(array); 

  //残りの単語array[0][0]をsplit(' ')を使って分割して配列array2に代入する
  const array2=array[0][0].split(' ');

  //配列array2が分割されたことを確認する
  console.log(array2);

}

このコードの実行結果です。

splitで分割は出来たが、一次元配列になってしまった。

分割は出来ましたが、一次元配列になってしまいました。
次の項目で二次元配列に変換します。


手順6:スプレッドシート出力前にarray3にmapを用いて二次元配列に変換する

const array3=array2.map(item=>[item]);

array2にmapメソッドを使って、[item]として二次元配列に変換しています。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const N=array[0][0];
  console.log(N);

  array.shift();
  console.log(array); 

  
  const array2=array[0][0].split(' ');
  console.log(array2);

  //二次元配列に変換する
  const array3=array2.map(item=>[item]);

  //変換出来たことをログで確認する
  console.log(array3);

}

このコードの実行結果です。

二次元配列に変換出来た結果の画像

無事に二次元配列として出力出来ました。
これでスプレッドシートの出力する準備が整いました。


手順7: 配列array3をスプレッドシートのC2から始まる黄色いセルに出力する

ss.getRange(2,3,N).setValues(array3);

セルC2は(2,3)です。
Nには5が入っているので5行分使って5つの単語を出力します。
列数の1は省略可能です。

単語が5つですので、setValuesとsが付く複数形になっています。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const N=array[0][0];
  console.log(N);

  array.shift();
  console.log(array); 

  
  const array2=array[0][0].split(' ');
  console.log(array2);

  
  const array3=array2.map(item=>[item]);
  console.log(array3);

  //スプレッドシートのC2(2,3)から始まる黄色いセルに出力する
  ss.getRange(2,3,N).setValues(array3);

}

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

最終的な、スプレッドシートの出力結果で、黄色いセルに5つの単語が出力sれた。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python mapの使い方

GASは以上です。


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

通勤経路で撮影した、雨粒のついたピンク色〜むらさき色の紫陽花です。
(スマホ写真のPhotoshop仕上げ)

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

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

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

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

■ 関連記事 ■

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


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

paiza レベルアップ問題集 標準入力その7「STEP: 1 改行区切りでの N 個の文字列の入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonで標準入力inputを用いて、文字列の個数と全ての文字列をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列になっていることを確認してから出力をしています。

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

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

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

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


改行区切りでの N 個の文字列の入力 (paizaランク D 相当)

問題:
1 行目に整数 N が与えられます。
2 行目以降に、N 個の文字列 s_1, … , s_N が N 行で与えられます。
s_1, … , s_N を改行区切りで出力してください。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目の文字列の個数5個を標準入力で整数として取得して、変数Nに代入する

2: 2行目からN(=5)個の文字列をループの中で標準入力を用いてprint文で出力する

の2ステップで行います。

今回は入出力例1を用います。

入力例1
5
hello
paiza
813
paiza2020
Nice

出力例1
hello
paiza
813
paiza2020
Nice

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

まず、1行目の文字列の個数5を変数Nに標準入力で取得します。

N=int(input())

intの中にinputを入れることで、整数として取得します。

#1行目の文字列の個数5を標準入力で整数として取得して変数Nに代入する
N=int(input())

#変数に取得できたことを出力して確認
print(N)

無事に文字列の個数5が変数Nに取得出来たことをprint文で出力した結果の画像です。


次に、ループを用いて5つの文字列を出力します。

for i in range(N):

今、Nに5が入っている状態です。

rangeの中にNを入れると、0から5未満の繰り返しが行われますので、iの動きは下記の様になります。

i=0
i=1
i=2
i=3
i=4

の5回分ループを回します。

temp=input()

ループの中で変数tempに標準入力で取得した文字を代入します。

このtempという変数は仮に、一時的に入れる箱として便利な変数名です。
その後、tempを出力しています。

tempには、文字列hello 〜 Nice までの5つの文字列を仮に入れて置く箱みたなものです。

N=int(input())
#print(N) ← コメントアウト

#2行目の文字列からN=5個の文字列を出力する
for i in range(N):
    temp=input()
    print(temp)

このコードの出力結果です。

Pythonは以上です。

次は、GASで解いて行きます。


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

スプレッドシートの文字揃えは、A列とC列の文字列部分を右揃えに統一しております。

緑色のセルA1(1,1)と、その下の灰色のセルに5個の文字列を貼り付けました。

paiza側の入力例1をコピーした後にスプレッドシート側で[Ctrl] + [Shift] + [V] のショートカットキーで貼り付けると元の書式を崩さずに綺麗に貼り付けられます。

灰色のセルA2から始まる5個の文字列の個数をN個として、文字列をC2(2,3)から始まる黄色いセルN=5行分出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

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

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

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

2: 緑色のセルA1から下の灰色の5行の文字列を含めた6行分を配列arrayに取得
(この時点で二次元配列になっている)

3: 先頭のarray[0][0]を文字列の個数Nに代入


4: ShiftメソッドでNに代入した先頭の要素を配列arrayから取り除く


5: 文字列のみが残った配列arrayをスプレッドシートのセルC2(3,2)から始まる黄色いセル5行分に出力する

以上の手順で進めて参ります。


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

const ss = SpreadsheetApp.getActiveSheet();

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

関数「standardInput1」の中にコードを書いていきます。

Standard Inputで標準入力の意味です。

function standardInput1() {

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

}


手順2:緑色のセルA1(1,1)から灰色のセルの文字列5つを合わせて、合計6行分を取得する

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

文字列は複数になりますので、getValuesとsが付く複数形になります。

function standardInput1() {

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

  //緑色のセルA1から6行分(文字列の個数5と文字列自体の行の合計6行分)を配列arrayに取得
  const array=ss.getRange(1,1,6).getValues();

}

また、arrayは二次元配列として取得されます。
ログで確認致します。

function standardInput1() {

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

  //arrayが二次元配列として取得されたことを確認する
  console.log(array);

}

実行結果によりarrayが二次元配列として取得出来たことが確認出来ました。

この配列の構成は、配列の添え字は0から始まりますので、

array[0][0]=5
array[1][0]=hello
array[2][0]=paiza
array[3][0]=813
array[4][0]=paiza2020

array[5][0]=Nice

の、6行1列配列として配列arrayが取得出来ました。


手順3:先頭のarray[0][0]を文字列の個数Nに代入

const N=array[0][0];

下記のコード実行後にN=5となっていることがログで確認出来ます。

function standardInput1() {

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

  //array[0][0]を文字列の個数として定数Nに代入する
  const N=array[0][0];

  //Nに文字列の個数5が代入されたことを確認する
  console.log(N);

}

手順4:ShiftメソッドでNに代入した先頭の要素array[0][0]を配列arrayから取り除く

array.shift();

下記のコードと実行結果で、文字数の個数である先頭の5が配列arrayから取り除けたことが確認出来ました。

function standardInput1() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,6).getValues();
  console.log(array);

  const N=array[0][0];
  console.log(N);

  //Nに代入した配列の先頭の要素をshiftを使って配列arrayから削除
  array.shift();

  //先頭の文字数5が削除されたことを確認
  console.log(array);

}

この画像から配列arrayが単語5つのみであり、尚且つarrayが既に二次元配列になっていることが確認出来ましたので、このままスプレッドシートの黄色いセルに貼り付ける処理に進めます。


手順5:スプレッドシートのC2(2,3)から始まる黄色いセルに文字列を5行分出力する

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

getRangeの中でセルC2である(2,3)と行数分の5が入っているNが使われています。
単語数が5つですので、複数形でsetValuessが付いています。

1列ですので、(2,3,N,1)と列数も指定出来ますが、1列の場合は省略可能です。
コードと実行後のスプレッドシートです。

function standardInput1() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,6).getValues();
  console.log(array);

  const N=array[0][0];
  console.log(N);

  array.shift();
  console.log(array);
  
  //スプレッドシートのセルC2(2,3)から始まる黄色いセルに配列arrayを出力する
  ss.getRange(2,3,N).setValues(array);

}


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

梅雨の時期に代々木公園で撮影した紫陽花です。

←標準入力その6へ          次の問題へ→

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

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

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

■ 関連記事 ■

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


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

paiza レベルアップ問題集 標準入力6「【N 個の整数の入力】1 行目で与えられる N 個の整数の入力 (large)」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonで標準入力inputや分割splitなどを用いて、数値の個数と全ての数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

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

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

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

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


【N 個の整数の入力】1 行目で与えられる N 個の整数の入力 (large) (paizaランク D 相当)

問題:
1 行目で、整数 N と、続けて N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目を標準入力inputやsplitなどを使って半角スペース区切りにした整数をリストarrayとして取得する

2: arrayの最初の数は整数の個数ですので、整数の個数を表す変数Nに代入して、N=array[0]とする


3: 上記で変数Nに代入したarray[0]を配列から削除するためにdelメソッドを使ってリストarrayを出力する5つの整数のみにする

4: 残りのリストarrayをループで出力する

・基本的なループ
・リスト出力に適したループ
・上記の内包表記

の4ステップで行います。

今回は入出力例1を用います。

入力例1
5 8 1 3 1 3

出力例1
8
1
3
1
3

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

paiza問題集の入力例。1行に数値の個数と数値自体が入力されている。

この6個の数値「5 8 1 3 1 3」は下記のコードでリスト形式で取得出来ますが、1行に複数の関数などが使われているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 半角スペースなどの指定の区切り文字で分割して取得する

int … 上記で取得する対象が整数である


rstrip … 右側にある不要な空白を取り除く


map … まとめて適用


list … リスト(配列)変換

#1行分を全てリスト形式になる様に標準入力で取得する
array=list(map(int,input().rstrip().split(' ')))

#リストarrayに取得出来たことを確認する
print(array)

このコードの実行結果です。
数値の個数5を含めた整数1行分がリストarrayに出力されました。

取得したリストarray


このコードの先頭の5、つまりarray[0]を数値の個数を表す変数Nに代入します。

array=list(map(int,input().rstrip().split(' ')))
print(array)

#リストの先頭の「5」をリストの個数を表す変数Nに代入する
N=array[0]

#Nに代入できたことを確認する
print(N)

このコードで、無事にNに5が代入されました。

リストから数値の個数の先頭の5を代入されたことを確認。


現在のarrayから、リストの個数であるNに代入した先頭の5をdelメソッドを使って削除します。

array=list(map(int,input().rstrip().split(' ')))
print(array)

N=array[0]
print(N)

#数値の個数Nに代入したリストarrayの先頭の5を削除する
del array[0]

#削除されたことを確認する
print(array)
リストから先頭の要素をdelで取り除いた画像。

リストarrayから個数が削除され、出力すべき数値のみになりました。


では、リストの残ったarrayをループを用いて解答の出力例に沿って縦に出力します。
最も基礎的なループでは、この様な解説とコードになります。

ループの中では、iの値が0,1,2,3,4の5つ、1つ分増えて行きます。
リストの添字は0から始まり、N=5ですのでarray[i]は、

array[0]=8
array[1]=1
array[2]=3
array[3]=1
array[4]=3

の5つの値が取得出来ます。

for i in range(N):

array=list(map(int,input().rstrip().split(' ')))
print(array)

N=array[0]
print(N)

del array[0]
print(array)

#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])

出力結果です。

ループを用いたリストの出力結果の確認

ここで、確認用に出力した変数や配列をコメントアウトします。

array=list(map(int,input().rstrip().split(' ')))
#print(array) ←コメントアウト

N=array[0]
#print(N) ←コメントアウト

del array[0]
#print(array) ←コメントアウト

#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])

基本的なループを用いて、解答の形に沿った縦型に出力出来ました。

paiza問題集ループを用いたリストの出力結果

次の少しだけ応用編(シンプルになるだけですので、大丈夫です)のループの出力に備えて、コメントアウトした分のコードを削除します。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])


次に、リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

等になります。

リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#arrayをリストに適したループで出力する
for num in array:
    print(num)

少しだけシンプルなコードで同じ出力結果が得られました。


更にコード短くするには、ループをたった1行で表記する内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

と表記致します。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#リストarrayを内包表記で出力する
[print(num) for num in array]

Pythonは以上です。
次は、GASで解いて行きます。


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

paizaの問題集をGoogle Apps Scriptで解くためのスプレッドシートの初期画像

入力の緑のセルA2の所に、paiza側の入力例1を貼り付けています。
その際、paiza側でコピーをした後、スプレッドシートのA2のところで、[Ctrl] + [Shift] + [V] を押すと、書式を崩さずに綺麗に貼り付けられます。

緑色のセルA2(2,1)の所に出力する数値と先頭の数値の個数5個を加えた「5 8 1 3 1 3」が入力されています。

先頭の5を除いた数値をC2(2,3)から始まる黄色いセル5行分に出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

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

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

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

2: 緑色のセルA2(2,1)を配列arrayに取得


3: 取得したarrayをログ出力


4: 数値の個数array[0]=5を定数Nに代入する


5: Nに代入したarray[0]を削除して出力する分の数値のみを残す

6: スプレッドシートに出力用の空の配列array2を宣言して、残った一次元配列であるarrayの要素をループを用いて二次元配列array2に格納する


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


8: スプレッドシートのC2(2,3)から始まる黄色いセルに5行分出力する

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

const ss = SpreadsheetApp.getActiveSheet();

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

下記のコードを関数「standardInput5」の中に書いて行きます。

Standard Inputで標準入力の意味です。

function standardInput5() {

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

}


手順2:緑色のセルA2(2,1)を配列arrayに取得

const array=ss.getRange(2,1).getValue().split(‘ ‘);

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  //色のセルA2(2,1)を配列arrayに取得
  const array=ss.getRange(2,1).getValue().split(' ');

}


手順3:取得したarrayをログ出力

console.log(array);

コードと実行結果です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  //取得したarrayをログ出力する
  console.log(array);

}

取得した配列array


手順4:数値の数であるarray[0]=5を定数Nに代入する

const N=array[0];

下記のコードと実行結果です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  //数値の数であるarray[0]=5を定数Nに代入する
  const N=array[0];

  //Nに5が代入されたことを確認する。
  console.log(N);

}

配列の先頭要素を定数Nに数値の個数として代入した実行結果の画像

配列arrayの先頭の5が無事にNに代入されました。


手順5: Nに代入したarray[0]を削除して出力する分の数値のみを残す

array.shift();

このshiftを用いて、arrayの先頭の数値の個数を削除します。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  //Nに代入した配列arrayの先頭を削除
  array.shift();

  //配列から先頭にあった数値の個数5が削除されていることを確認
  console.log(array);

}
配列にshiftを用いて、先頭の要素を削除した後の配列array

この様に、配列.shift();を使うと先頭の要素が削除されたことが確認出来ました。


手順6:スプレッドシートに出力用の空の配列array2を宣言して、残った一次元配列であるarrayの要素をループを用いて二次元配列array2に格納する

ループの部分は、

let i=0; i<N ; i++

と表記しています。
iには、array[i]の添え字として0から4まで入ります。
N=5ですので、i<Nになります。

array2.push([array[i]]);

また、ループの中で[array[i]]とarray[i]全体にカッコで括っているのは、二次元配列としてarray2に追加をしている為です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  //スプレッドシート出力用の空の配列array2を宣言
  const array2=[];

  //ループを用いて残りのarrayを二次元配列としてarray2に格納する
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

}


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

console.log(array2);

前の手順でarrayからpushを持ちて二次元配列になるようにループで格納したarray2がスプレッドシートに出力可能な二次元配列の形になっていることを確認します。

array2がスプレッドシートに出力可能な二次元配列になっていることをログで確認


手順8:スプレッドシートのC2(2,3)から始まる黄色いセルに5行分出力する

ss.getRange(2,3,N).setValues(array2);

セルC2が(2,3)です。
getRange(2,3,N)でN行、つまり5行分出力をします。
getRange(2,3,N,1)と書くと1列分の列数も指定出来るのですが、1列の場合は省略可能です。

setValuesとsが付く複数形になっているのは、出力用配列array2に格納された数値の個数が5個と複数になっているからです。

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

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  const array2=[];

  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

  console.log(array2);

  //スプレッドシートのC2(2,3)から始まる黄色いセルにN=5行分の数値を出力する
  ss.getRange(2,3,N).setValues(array2);

}
Google Apps Script実行後のスプレッドシート。二次元配列の数値を黄色いセルの所に出力している。

無事に黄色いセルに数値5個分が出力されました。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python「rstrip() メソッド」で文字列の右端を整えよう!
Python mapの使い方
Pythonでlistから要素を削除する方法

GASは以上です。


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

奥多摩の秋川渓谷を散策中に撮影した、東京都檜原村にある「払沢の滝」滝壺です。

←前の問題へ          標準入力その7→

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

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

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

■ 関連記事 ■

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

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

paiza レベルアップ問題集 標準入力その6「STEP: 4 2 行目で与えられる N 個の整数の入力 (large)」をPythonとGASの両方で解いたコードを紹介

この記事を読むことで、Pythonで標準入力inputとsplitなどを用いて、数値の個数と、その全ての数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

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

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

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

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


2 行目で与えられる N 個の整数の入力 (large) (paizaランク D 相当)

問題:
1 行目で整数 N が与えられます。
2 行目で、N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

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


手順として、

1: 1行目を標準入力で整数型Nとして取得する

2: 2行目を標準入力inputやsplitといった関数などを使って半角スペース区切りの整数をリストarrayに取得する

3: リストarrayをループで出力する

・基本的なループ
・リスト出力に適したループ
・上記の内包表記  

の3ステップで行います。

今回は入出力例1を用います。

入力例1
5
8 1 3 10 100

出力例1
8
1
3
10
100

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

まずは、1行目の数値の個数5を標準入力で取得して、変数Nに代入して、正しく取得できたことをprint関数で確認します。

#1行目を標準入力で数値として取得して個数Nに代入する
N=int(input())

#数値の個数Nが取得できたことを確認する
print(N)

実行結果です。

無事に数値の個数N=5個が取得出来ました。

入力例2行目の5個の数値「8 1 3 10 100」は下記のコードで取得出来ますが、1行に複数の関数などが使われているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 半角スペースなどの指定の区切り文字で分割して取得する

int … 上記で取得する対象が整数である


rstrip … 右側にある不要な空白を取り除く


map … まとめて適用


list … リスト(配列)変換

上記を用いてコードを掲載致します。
一気に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

N=int(input())
print(N)

#2行目からN個分の数値をリストarrayに取得
array=list(map(int,input().rstrip().split(' ')))

#リストarrayにN個の数値が格納されたことを確認する
print(array)

出力結果です。

これで、リストとして無事に出力が出来ました。


では、リストarrayをループを用いて解答の出力例に沿って縦に出力します。
最も基礎的なループでは、この様な解説とコードになります。

ループの中では、iの値が0,1,2,3,4の5つ、1つ分増えて行きます。
リストの添字は0から始まり、N=5ですのでarray[i]は、

array[0]=8
array[1]=1
array[2]=3
array[3]=10
array[4]=100

の5つの値が取得出来ます。

for i in range(N):

N=int(input())

#確認用の出力の為、後で消す
print(N)

array=list(map(int,input().rstrip().split(' ')))

#確認用の出力の為、後で消す
print(array)

#リストarrayをループで出力する
for i in range(N):
    print(array[i])
    

出力結果です。

ループを用いて、解答の形に沿った縦型に出力出来ました。


ここで、一度コードの整理をしたいので、確認用に使ったprint文をコメントアウトします。

N=int(input())
#print(N)

array=list(map(int,input().rstrip().split(' ')))
#print(array)

#リストarrayをループで出力する
for i in range(N):
    print(array[i])


この状態で実行すると、

この様にスッキリしました。


次に、リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

等になります。

リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

コメントアウトした部分を削除したコードを掲載致します。

N=int(input())
array=list(map(int,input().rstrip().split(' ')))

#arrayをリストに適したループで出力する
for num in array:
    print(num)

この書き方でも同様の出力結果になりました。


更にコード短くするには、ループをたった1行で表記する内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

と表記致します。

N=int(input())
array=list(map(int,input().rstrip().split(' ')))

#リストarrayを内包表記で出力する
[print(num) for num in array]

Pythonは以上です。
次は、GASで解いて行きます。


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

スプレッドシートの出力前の画像です。

入力の所は、paiza側の入力例をコピーして、スプレッドシートに貼り付ける際には[Ctrl]+[Shift]+[V]で貼り付けると書式が崩れなくてスプレッドシートの元の書式を保ったまま綺麗に貼り付けられます。

緑色のセルA2(2,1)に数字の個数N=5を、灰色のセルA3(3,1)の5個の数値を取得し配列arrayに格納、それを加工してC2(2,3)から始まる黄色いセルに出力します。

その際この黄色いセル5行分は、二次元配列として取得した整数が格納された配列を出力します。

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

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

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

2: 緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する


3: 取得したnum
とarrayをログ出力で確認する

4: num[0][0]を数字の個数N=5になるように格納する


5: num[1][0]にsplitメソッドを使って、配列arrayに格納
する

6: 取得した配列arrayをログ出力する


7: スプレッドシート出力用に空の配列array2を宣言して、配列arrayの要素を二次元配列になるようにarray2にループで格納
する

8: スプレッドシート出力前に二次元配列array2をログ出力する


9: スプレッドシートのC2(2,3)から始まる黄色いセル5行に数値を格納する

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

const ss = SpreadsheetApp.getActiveSheet();

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

コードを関数「standardInput4」に書いて行きます。

Standard Inputで標準入力の意味です。

function standardInput4() {

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

手順2:緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する

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

getRangeの中の(2,1,2)ですが、セルA2が(2,1)です。
また、最後の2は2行分を表しています。
列の1列まで書くと(2,1,2,1)になりますが、1列の場合は省略可能です。

getValuesと複数形になっているのは、2つのセルを取得するので複数形のsが付いています。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する
  const num=ss.getRange(2,1,2).getValues();

}

手順3:取得した配列numをログ出力する

console.log(num);

このコードを実行して、リストnumをログ出力して、セルA2とA3が取得出来たことを確認します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する
  const num=ss.getRange(2,1,2).getValues();

  //取得したnumをログ出力
  console.log(num);

}

手順4:num[0][0]を数字の個数Nに格納してログで確認する

const N=num[0][0];

取得した二次元配列のnum[0][0]がA2に当たります。
この配列は、2行1列ですので、A3はnum[1][0]になります。

ここでは、num[0][0]を定数Nに5個として取得するコードと、確認としてその実行結果のログを掲載致します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  //セルA2に該当するnum[0][0]を数値の個数N=5として格納する
  const N=num[0][0];

  //定数Nに数値の個数5個が格納出来たことをログ出力で確認する
  console.log(N);

}


手順5:num[1][0]にsplitメソッドを使って、配列arrayに格納してログで確認する

const array=num[1][0].split(‘ ‘);

コードと実行結果です。
灰色のセルA3をsplitを使って、半角文字で区切って配列arrayに格納します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  //num[1][0]にsplitメソッドを使って、配列arrayに格納
  const array=num[1][0].split(' ');

}

手順6:取得した配列arrayをログ出力する

console.log(array);

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

 
  const array=num[1][0].split(' ');

  //取得した配列arrayをログ出力する
  console.log(array);

}
配列arrayに分割して格納。splitメソッドを使用

この画像について、最初の配列numではそのまま半角スペース込みで取得されています。

それを今回split(‘ ‘)を使ったことによって、配列arrayには半角スペースで区切られて取得出来たことが確認出来ました。


手順7:スプレッドシートに出力用の空の配列array2を宣言して、二次元配列array2になる様に配列arrayをループで末尾に追加しながら格納する

array2.push([array[i]]);

空の配列array2を宣言してそこにpushを使って、arrayの要素をループの中で順番に格納して行きます。

[array[i]]と、array[i]の全体に[ ]で括っているのは、二次元配列として格納してスプレッドシートに出力可能な形式にする為です。

ループの部分では、

for(let i=0;i<N;i++)

ここでは、array2にarrayをループで格納する際に、iの値を0,1,2,3,4と5つ分格納しています。

iの値が変わるので、変数になり let i=0 とループ開始の所でletを用いて宣言をしています。

リストは添字0から始まりますので、iには0から4までの値が代入され、Nは5になりますので、 「 i<N 」となっております。

ここまでのコードです。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  //スプレッドシート出力用の空の配列array2を宣言
  const array2=[];

  //配列arrayを二次元配列array2にループで格納
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

}

この解説よりも、セルA2から個数のNを、セルA3から配列のarrayをそれぞれ取得する方法の方がシンプルです。

しかし、スプレッドシートにアクセスする回数を減らすため、一度に配列numとして取得して、それぞれにN=num[0][0]、array=num[1][0]を代入しました。

どちらも後ろのnumの値が[0]になっているのは、この配列が1列だからです。



手順8:スプレッドシート出力前に二次元配列array2をログ出力する

console.log(array2);

空の配列だったarray2に、スプレッドシートの出力形式に合う二次元配列として数値が格納されたことを下記コードのログで確認します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  const array2=[];

  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

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

}

無事にarray2が二次元配列として格納されたことが確認出来ました。


手順9:スプレッドシートのC2(2,3)から始まる黄色いセル5行分にarray2に格納された数値を出力する

ss.getRange(2,3,N).setValues(array2);

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

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  const array2=[];

  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }


  console.log(array2);

  //スプレッドシートのC2から始まる黄色いセルをN=5行分に出力する
  ss.getRange(2,3,N).setValues(array2);
  
}
Google Apps Scriptで出力したスプレッドシート

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python「rstrip() メソッド」で文字列の右端を整えよう!
Python mapの使い方


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

よみうりランドのXmasイルミネーションの「ジュエルミネーション」です。

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

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

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

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

■ 関連記事 ■

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

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

paiza レベルアップ問題集 標準入力その6「STEP: 3 1 行目で与えられる N 個の整数の入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonで標準入力とsplitなどのメソッドを複数用いて、リスト(配列)に数値を格納して、個数を除いたリスト内の数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列に格納して出力しています。

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

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

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

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


1 行目で与えられる N 個の整数の入力 (paizaランク D 相当)

問題:
1 行目で、整数 N と、続けて N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目の整数を標準入力で数値として取得する際標準入力と幾つかの関数を使って、数値の個数と出力する数値を全てリストarrayに格納する

2: リスト(添字0から始まる)の1番目の添字0の要素を数値の個数Nとする


3: リストの2番目の添字1の要素から最後の添字N-1の要素までをループで出力する

・シンプルなループ
・上記の内包表記

の3ステップで行います。

今回は入出力例1を用います。

入力例1
13 5085 2923 8669 3231 7032 73 2683 8317 5545 9774 7179 2646 2470

出力例1
5085
2923
8669
3231
7032
73
2683
8317
5545
9774
7179
2646
2470

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

この一番初めの13は、次の「5085」〜「2470」までの数値の個数13個を表しています。

まずはこの1行全てを標準入力で、いくつかの関数も使って数値として取得して、リストの形に変換してarrayに格納します。

このコード1行に複数の関数を使用しているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 指定の区切り文字で分割して取得する

int … 上記 inputで取得する対象が整数である


map … 関数をまとめて適用


list … リスト(配列)変換

上記の関数を用いてコードを掲載致します。

splitの区切り文字の指定は、問題文の通り半角スペースです。

関数が沢山に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

#1行分をリストとして取得してarrayに格納
array=list(map(int,input().split(' ')))

#arrayにリストの形式で数値が格納されていることを確認
print(array)

この様にリストとして格納出来ました。

この先頭のarray[0]に当たる13を数値の個数Nとして取得と確認をします。

array=list(map(int,input().split(' ')))
print(array)

#数値の個数Nにarray[0]を代入する
N=array[0]

#Nに代入出来たことを確認する
print(N)

N=13が正しく代入されたことが確認出来ました。
この状態で、配列の2番目のarray[1]=5085 〜 配列の末尾array[13]までループで出力します。

その際、ループの開始条件の指定では、

for i in range(1,N+1):

と記述します。

これは、ループの添字(インデックス)のiが、i=1,2, … 13の要素を取得する際、rangeの終わりの値はその数未満、つまり12になってしまうので、Nに1を足す必要があります。

この説明が分かり辛いかもしれませんので、まずはN+1の「+1を省いて」出力致します。

array=list(map(int,input().split(' ')))
#確認用の為、コメントアウト
#print(array)

N=array[0]

#確認用の為、コメントアウト
#print(N)

#ループをi=1からNと指定して出力
for i in range(1,N):
    print(array[i])

このコードの出力結果ですが、array[12]の「2646」までしか出力されておらず、最後のarray[13]の「2470」が抜けた結果になっています。

これで視覚的にrange(1,N)だと、Nが13だから13未満の12までしかループが回らないことが確認出来ましたので、この部分をrange(1,N+1)に修正したコードと実行結果を掲載致します。

(確認用に出力したコメントアウトした分は削除しました。)

array=list(map(int,input().split(' ')))
N=array[0]

#ループをi=1からN+1と指定して出力
for i in range(1,N+1):
    print(array[i])


更にコード短くする方法として、内包表記を用います。

[出力結果のprint文 for から「:」の直前まで]

今回の例ですと、

[print(array[i]) for range(1,N+1)]

とループが1行のコードで出力可能になります。

array=list(map(int,input().split(' ')))
N=array[0]

#ループを内包表記で出力
[print(array[i]) for i in range(1,N+1)]   

これでループの部分が1行とスッキリした記述になりました。

Pythonは以上です。
次は、GASで解いて行きます。


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

緑のセルA2(2,1)の数値を取得し、最初の数値13を数値の個数として定数Nに代入して、2番目の数値から最後までをC2(2,3)から始まる黄色いセルに出力します。

その際、この黄色いセルの範囲には、二次元配列として取得した整数が格納された配列を出力します。

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

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

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

2: 緑色のセルA2(2,1)の数値を個数13個と、その後の13個分の数値をsplitメソッドを用いて配列としてarrayに取得する


3: 取得した配列arrayをログ出力する


4: 配列の先頭の添字0の要素array[0]をNに代入してN=13になることを確認する


5: 空の配列array2を宣言して、arrayの2番目array[1]から最後の要素array[13]を二次元配列array2に格納する


6: スプレッドシートに出力前にarray2が二次元配列として数値を格納出来たことをログ出力して確認する


7: 二次元配列array2をスプレッドシートのC2(2,3)から始まる黄色いセルに出力する


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

const ss = SpreadsheetApp.getActiveSheet();

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

コードを関数「standardInput3」に書いて行きます。

Standard Inputで標準入力の意味です。

function standardInput3() {

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

}


手順2:緑色のセルA2(2,1)の数値を個数13個と、その後の13個分の数値をsplitメソッドを用いて配列としてarrayに取得する

splitの区切り文字の指定は、問題文の通り半角スペースです。

array=ss.getRange(2,1).getValue().split(‘ ‘);

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルA2の数値の個数と数値をsplitメソッドを用いて配列として取得
  const array=ss.getRange(2,1).getValue().split(' ');

}


手順3:取得した配列arrayをログ出力する

console.log(array);

コードと実行結果です。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  //取得した配列arrayをログ出力する
  console.log(array);

}


手順4:配列の先頭の添字0の要素array[0]をNに代入してN=13になることを確認する

const N=array[0];

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  //配列の先頭の添字0の要素数array[0]をNに代入する
  const N=array[0];

  //Nをログ出力で確認する
  console.log(N);

}

実行結果のログです。


手順5:空の配列array2を宣言して、arrayの2番目array[1]から最後の要素array[13]を二次元配列array2に格納する

空の配列array2にpushメソッドを使ってarray[1]からarray[13]までを二次元配列になるようループで格納します。

ループの中で、array[i]の値が1から13まで変わるので変数としてletで宣言しています。
また、二次元配列になる様に、[array[i]]と配列array全体を[ ]で括っています。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  //スプレッドシート出力用の空の配列array2を宣言
  const array2=[];

  //配列arrayの2番目から最後の要素を二次元配列になるようにarray2に格納する
  for(let i=1;i<=N;i++){
    array2.push([array[i]]);
  }

}


手順6:スプレッドシートに出力前にarray2が二次元配列として数値を格納出来たことをログ出力して確認する

console.log(array2);

コードと実行結果のログです。

無事に二次元配列として格納されたことが確認出来ました。


手順7:二次元配列array2をスプレッドシートのC2(2,3)から始まる黄色いセルに出力する

ss.getRange(2,3,N).setValues(array2);

C2が(2,3)で、N行出力するのでgetRangeに(2,3,N)と指定します。
また1列の(2,3,N,1)の1は省略可能です。

また、配列の数値は複数ですので、setValuesとsを付けて複数形にします。

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

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python mapの使い方


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

横浜みなとみらい、ランドマークタワーの夜景と観覧車です。

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

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

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

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

■ 関連記事 ■

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

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

paiza レベルアップ問題集 標準入力その6「STEP: 2 2 行目で与えられる N 個の整数の入力」をPythonとGASの両方で解いたコードを紹介

この記事を読むことで、Pythonで標準入力とsplitメソッドなどを用いて、数値の個数と、全ての数値をリスト(配列)に格納して、ループで出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

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

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

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

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


2 行目で与えられる N 個の整数の入力 (paizaランク D 相当)

問題:
1 行目で整数 N が与えられます。
2 行目で、N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

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


手順として、

1: 1行目は整数の個数を標準入力で数値として取得して、変数Nに代入する

2: 2行目は標準入力と幾つかのメソッドを使って、N個の整数を全てリストarrayに格納する


3: 格納したリストの要素をループで出力する

・シンプルなループ
・リスト出力に適したループ
・上記の内包表記
 

手順として、

の3ステップで行います。

今回は入出力例1を用います。

入力例1
6
6561 3785 6338 9568 4956 557

出力例1
6561
3785
6338
9568
4956
557

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

まずは1行目の数値の個数6個を標準入力で取得して、変数Nに代入してその結果を確認します。

#標準入力で1行目の数値の個数6を取得して変数Nに代入する
N=int(input())

#数値の個数6個がNに代入されたことを確認する
print(N)

出力結果の画像です。

次に2行目の6個の数値を標準入力で取得してリストarrayに格納します。

それをリストの形に変換して、コード1行に複数の関数を使用しているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 指定の区切り文字で分割して取得する

int … 上記 inputで取得する対象が整数である


map … 関数をまとめて適用


list … リスト(配列)変換

上記の関数を用いてコードを掲載致します。

関数が沢山に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

N=int(input())
print(N)

#6個の半角スペース区切りの数値をリストに変換してarrayに格納す
array=list(map(int,input().split(' ')))

#arrayに6つの数値が格納されたことを確認する
print(array)

無事に、arrayにリストとして6つの整数が格納されました。
このリストの数値をループで縦に出力します。

では、リストarrayをループを用いて解答の出力例に沿って縦に出力します。

for i in range(N):

N=int(input())
print(N)#確認用のprint文…後で消す

array=list(map(int,input().split(' ')))
print(array)#確認用のprint文…後で消す

#ループをN=6回回わして、順番にリストの数値を出力する
for i in range(N):
    print(array[i])

少し、確認用に出力した分が見辛くなって来ましたので、ここでNやarrayの確認用に使ったprint文を削除します。

そのコードと実行結果です。

N=int(input())
array=list(map(int,input().rstrip().split(' ')))


#ループをN=6回回わして、順番にリストの数値を出力する
for i in range(N):
    print(array[i])


リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

になります。

リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

N=int(input())
array=list(map(int,input().split(' ')))


#リスト出力に便利なループの書き方
for num in array:
    print(num)

更にコード短くするのに、内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

とループが1行のコードで出力可能になります。

N=int(input())
array=list(map(int,input().split(' ')))

#リスト出力に便利なループの書き方の内包表記
[print(num) for num in array]

Pythonは以上です。
次は、GASで解いて行きます。


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

A列に入力例1を貼り付ける際、paizaの入力例1をコピーして、[Ctrl] + [Shift] + [V] で貼り付けると書式を崩さずに貼り付けられます。

緑色のセルA2(2,1)に入力した数列の個数を取得して、セルA3(3,1)の灰色の所の数列を取得し、それをC2(2,3)から始まる黄色いセルに緑色のセル分(6個)出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

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

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

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

2:緑のセルA2(2,1)にある整数の個数を取得して定数Nに代入する


3:灰色のセルA3(3,1)をsplitメソッドで空白による分割をして配列arrayに格納


4:取得したarrayをログ出力する


5:スプレッドシートに出力する為、空の配列array2を用意して、二次元配列としてarrayの要素をループを用いてarray2に格納する


6:スプレッドシート出力前に二次元配列array2をログ出力する


7:C2(2,3)からN=6行分をスプレッドシートの黄色い所に出力する


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

const ss = SpreadsheetApp.getActiveSheet();

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

関数「standardInput2」にコードを書いていきます。

Standard Inputで標準入力の意味です。

function standardInput2() {

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

}

手順2:緑のセルA2(2,1)にある数値の個数Nを取得して6個の6が取得出来たことを確認

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

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルA2にある数値の個数を定数Nに取得
  const N=ss.getRange(2,1).getValue();

  //Nを出力して確認
  console.log(N);

}

手順3:灰色のセルA3(3,1)splitメソッドで空白による分割をして配列arrayに格納

const array=ss.getRange(3,1).getValue().split(‘ ‘);

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  //灰色のセル1列をsplitメソッドで空白による分割をして配列arrayに取得
  const array=ss.getRange(3,1).getValue().split(' ');

}


手順4:取得した配列arrayをログ出力する

console.log(array);

コードと実行結果です。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const array=ss.getRange(3,1).getValue().split(' ');

  //取得したarrayをログ出力する
  console.log(array);

}

arrayには数値がこのような一次元配列として格納されたことが確認出来ました。


手順5:スプレッドシート出力用の空の配列array2を用意して、ループを用いてarrayからarray2に二次元配列として格納する

ここで、ループを使用して、arrayの配列の要素をarray2にpushを使って追加していきます。

その際、[array[i]]と配列全体に[ ]で括っています。

また、ループでは配列が添字0から始まるため、i=0が開始の値で、i<array.lengthとすることで、iの値が0,1,2,3,4,5と長さ6つ分変化していきます。

注意点として、arrayの長さが6でiが0から始まるため、i<array.lengthと「<」を使っています。

「 i 」の値が変わるので変数として、ループの開始の所でletを用いて宣言しております。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const array=ss.getRange(3,1).getValue().split(' ');
  console.log(array);


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

  //ループの中でpushを用いてarrayから二次元配列array2に二次元配列として格納する
  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
  }

}


手順6:スプレッドシート出力前にarray2に二次元配列として格納できたことをログ出力で確認する

console.log(array2);

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const array=ss.getRange(3,1).getValue().split(' ');
  console.log(array);


  
  const array2=[];

  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
  }

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

}

これで、array2が二重カッコになっていることから、二次元配列として格納されたことが確認出来ました。

この形になって初めてスプレッドシートに出力出来ます。


手順7:スプレッドシートのC2(2,3)から始まる黄色いセルにN=6行分出力する

ss.getRange(2,3,N).setValues(array2);

C2が(2,3)であり、そこから6行分のNで(2,3,N)、1列分で(2,3,N,1)になりますが、列の1は省略可能です。

また、数値の個数分がarray2に格納されて6個と複数個ですので、setValuesと複数形のsを付けます。

コードとスプレッドシートの実行結果です。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  const array=ss.getRange(3,1).getValue().split(' ');
  console.log(array);
  

  const array2=[];

  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
  }

  console.log(array2);


  //スプレッドシートのC2(2,3)から始まる黄色いセルに出力する
  ss.getRange(2,3,N).setValues(array2);

}

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python mapの使い方


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

いたばし花火大会(東京都板橋区)です。

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

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

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

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

■ 関連記事 ■

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

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

paiza レベルアップ問題集 標準入力その6「STEP: 1 改行区切りでの N 個の整数の入力」をPythonとGASの両方で解いたコードを紹介

この記事を読むことで、Pythonで標準入力を用いて数値の個数と、全ての数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列を用いてループを使わずに出力しています。

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

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

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

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

改行区切りでの N 個の整数の入力 (paizaランク D 相当)

問題:

1 行目で整数 N が与えられます。
2 行目以降で、N 個の整数 a_1, … , a_N が N 行で与えられます。
a_1, … , a_N を改行区切りで出力してください。

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


手順として、

1:標準入力で整数の個数Nを取得する

2:ループの中で標準入力を使い、N個全ての整数を出力する

の2ステップで行います。

今回は入出力例1を用います。

入力例1
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

出力例1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

画像が縦長になりますので、少し縮小しました。

下記のコードで標準入力とprint文での出力を行います。

1から20までの整数の個数20が一番初めに入力例1にありますので、それをNに標準入力で整数として取得します。

ループの中でN回、つまり20回ループを回します。
変数tempに代入してprint文で出力しています。

#1:標準入力で整数の数Nを取得する
N=int(input())

#2:ループの中で標準入力を使い、N個全ての整数を出力する
for i in range(N):
    temp=int(input())
    print(temp)

このコードの実行(出力)結果です。

Pythonは以上です。

次は、GASで解いて行きます。


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

paizaの入力例1をコピーして、スプレッドシートのA列にショートカットキー[Ctrl] + [Shift] + [V] を用いて貼り付けると、書式が崩れないで貼り付けられます。

緑色セルA1(1,1)に入力した、数値の個数である20をNに代入して、A2(2,1)から始まる灰色のセルの数値を20個分取得し、それを黄色いセルC1(1,3)から始まる20行に出力します。

その際この灰色のA2(2,1)から始まる20行のセルを二次元配列として取得してarrayに格納して、その整数が格納された配列arrayをC1(1,3)の黄色いセル20行に出力します。

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

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

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

2:緑のセルA1(1,1)にある20を数値の個数Nとして取得

3:灰色のセルA2(2,1)から始まるN(20)行1列を配列arrayに取得

4:取得したarrayをログ出力して二次元配列として格納されてることを確認する。

5:スプレッドシートのC1(1,3)から始まる黄色いセル20行分に出力する

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

const ss = SpreadsheetApp.getActiveSheet();

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

このコードを関数「standardInput1」に書いていきます。

Standard Inputで標準入力の意味です。

function standardInput1() {

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

手順2:緑のセルA1(1,1)に入力されている数値の個数20を取得して定数Nに格納する

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

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルA1(1,1)に入力されている数値の個数20を取得して定数Nに格納
  const N=ss.getRange(1,1).getValue();

  //Nが取得出来たことを確認
  console.log(N);
 
}

手順3:A2(2,1)から始まる灰色のセルをN(=20)行1列分を配列arrayに取得

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

セルA2は(2,1)で行数N=20ですので、(2,1,N)で(2,1,20)と同意です。
列数も入れると(2,1,N,1)ですが、1列の場合は省略出来ます。

配列の数値は20個と複数ですので、getValuesとsが付く複数形になります。

unction standardInput1() {

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

  //灰色のセルN行1列を配列arrayに取得
  const array=ss.getRange(2,1,N).getValues();
  
}

手順4:スプレッドシート出力前に灰色のセルのA2から取得した配列arrayをログ出力する

console.log(array);

コードの実行結果のログです。

function standardInput1() {

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

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

  //arrayをログ出力して灰色のセルA2から20行分が取得出来たことを確認する
  console.log(array);

}

arrayが二次元配列として取得出来たことが確認出来ました。

手順5:スプレッドシートのC1(1,3)から始まる黄色いセル20行分に配列arrayを出力する

ss.getRange(1,3,N).setValues(array);

function standardInput1() {

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

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

  //スプレッドシートのC1(1,3)から始まる黄色いセルに配列arrayを格納する
  ss.getRange(1,3,N).setValues(array);

}

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

GASは以上です。


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

雨露が輝く代々木公園のバラです。

←標準入力その5へ          次の問題へ→

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

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

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

■ 関連記事 ■

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

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