GASとPythonで、paiza レベルアップ問題集 配列メニュー を解いてみた6

このコーナーでは、学習コンテンツpaizaのレベルアップ問題集の中から気になった問題をPythonとGASの両方で解いてみます。

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

問題文URL:部分配列 (paizaランク D 相当)

配列arrayは、array=[1,2,3,4,5]で、この配列のA番目からB番目までの部分配列を作ります。
Aが2、Bが4だとしたら、部分配列は[2,3,4]になります。
また、配列の要素数はNで、この場合はN=5です。

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

入力例
1行目 A,B,N
2行目 配列array

具体例
1行目 2,4,5
2行目 1,2,3,4,5

出力
2
3
4

解き方

手順として、
1.A,B,Nを読み込む
2.配列aを読み込む
3.ループの中でスライスを使って部分配列を出力する

コードを見てみましょう。

手順1:A,B,Nを読み込む
A,B,N=map(int,input().rstrip().split(‘ ‘))

手順2:配列aを読み込む
a=list(map(int,input().rstrip().split(‘ ‘)))

手順3:ループの中でスライスを使って部分配列を出力する
for num in array[A-1:B]:
 print(num)

スライスを使っている部分は、A=2番目はインデックス1、B=4番目はインデックス3になります。
なので、array[1:4]とすると、array[1]、array[2]、array[3]が出力されます。
[1:4]の4とすると、4より小さい3までの処理になります。
A=2、B=4を[1:4]にするには、array[A-1:B]です。

Pythonの全コードです。

#A番目、B番目、配列の要素数Nを読み込む
A,B,N=map(int,input().rstrip().split(' '))

#配列arrayを読み込む
array=list(map(int,input().rstrip().split(' ')))

#部分文字列をスライスを使って表示する
for num in array[A-1:B]:
    print(num)

では、同じ問題をGASで解いてみます。

まず、スプレッドシートにこの様に配置しました。

左からA番目(2番目)をB1、左からB番目(4番目)をB2、配列の要素数N=5をB3に表示しました。
配列arrayは5行目にあり、要素交換後は8行目に出力します。

手順はこのようになります。
1:スプレッドシートからアクティブシートをアクセスする
2:左からA番目(2番目)を読み込む
3:左からB番目(4番目)を読み込む
4:配列arrayの要素数N=5を読み込む
5:配列array自体を読み込む
6:arrayの部分配列用のarray2を用意する
7.スライスを使ってarray2に部分配列を格納する
8.スプレッドシートに出力する

手順1,2,3,4:A,B,Nを読み込む
const sheet=SpreadsheetApp.getActiveSheet();
let A=sheet.getRange(1,2).getValue();
let B=sheet.getRange(2,2).getValue();
let N=sheet.getRange(3,2).getValue();

手順5:配列aを読み込む
let a=sheet.getRange(5,2,1,N).getValues();

ログを使って確認
console.log(array);

手順6:arrayの部分配列用のarray2を用意する
let array2=[];

手順7:スライスを使ってarray2に部分配列を格納する
array2[0]=array[0].slice(A-1,B);

array2をログで確認
console.log(array);

手順8:スプレッドシートに出力する
sheet.getRange(8,2,1,array2[0].length).setValues(array2);

実行結果です。8行目の黄色いセルに入っています。

GASの全コードです。

function arraySlice(){

//シートを取得
sheet=SpreadsheetApp.getActiveSheet();

//配列のA番目(左から2番目)を取得
let A=sheet.getRange(1,2).getValue();

//配列のB番目(左から4番目)を取得
let B=sheet.getRange(2,2).getValue();

//配列の要素数Nを取得
let N=sheet.getRange(3,2).getValue();

//配列arrayを取得
let array=sheet.getRange(5,2,1,N).getValues();

console.log(array);

//部分配列をarray2に入れる
let array2=[];

//スライスを使ってarray2に部分配列を格納する
array2[0]=array[0].slice(A-1,B);

console.log(array2);

//スプレッドシートに出力する
sheet.getRange(8,2,1,array2[0].length).setValues(array2);


}

お疲れ様でした。

ブレイクタイムフォトはこちらになります。

スカイツリーと河津桜

参考文献です。

GAS自作サンプル集に戻る
Python自作サンプル集に戻る
息抜きに、写真で癒し(=^x^=)

基本情報技術者試験
自己紹介

GASとPythonで、paiza レベルアップ問題集 配列メニュー を解いてみた5

このコーナーでは、学習コンテンツpaizaのレベルアップ問題集の中から気になった問題をPythonとGASの両方で解いてみます。

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

問題文URL:配列の要素の入れ替え (paizaランク D 相当)

配列arrayは、array=[1,2,3,4,5]で、この配列のA番目とB番目を入れ替えます。
Aが2、Bが3だとしたら入れ替え後の配列arrayは[1,3,2,4,5]になります。
また、配列の要素数はNで、この場合はN=5です。

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

入力例
1行目 A,B,N
2行目 配列array

具体例
1行目 2,3,5
2行目 1,2,3,4,5

出力
1,3,2,4,5

解き方1:方法1:tempを使って配列の要素を交換する

手順として、
1.A,B,Nを読み込む
2.配列aを読み込む
3.tempにarray[A-1]を代入する(配列は0番目スタート)
4.array[A-1]をarray[B-1]で置き換える
5.array[B-1]をtempで置き換える
6.ループで置き換え後のarrayを取り出す

コードを見てみましょう。

手順1:A,B,Nを読み込む
A,B,N=map(int,input().rstrip().split(‘ ‘))

手順2:配列aを読み込む
a=list(map(int,input().rstrip().split(‘ ‘)))

手順3:tempにarray[A-1]を代入する
temp=array[A-1]

手順4:array[A-1]をarray[B-1]で置き換える
array[A-1]=array[B-1]

手順5:array[A-1]をarray[B-1]で置き換える
array[B-1]=temp

手順6:ループで置き換え後のarrayを取り出す
for num in array:
print(num)

ここまでのコードです。

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

temp=array[A-1]
array[A-1]=array[B-1]
array[B-1]=temp

for num in array:
  print(num)

もう一つの方法として、手順3から手順5のtempを使って要素入れ替えをたった1行で行える方法もあります。

array[A-1],array[B-1]=array[B-1],array[A-1]

赤枠の方法での全コードです。

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

#ポイント ここで入れ替えている
array[A-1],array[B-1]=array[B-1],array[A-1]

for num in array:
    print(num)

では、同じ問題をGASで解いてみます。

まず、スプレッドシートにこの様に配置しました。

左からA番目(2番目)をB1、左からB番目(3番目)をB2、配列の要素数NをB3に表示しました。
配列arrayは5行目にあり、要素交換後は8行目に出力します。

手順はこのようになります。
1:スプレッドシートからアクティブシートをアクセスする
2:左からA番目(2番目)を読み込む
3:左からB番目(3番目)を読み込む
4:配列arrayの要素数Nを読み込む
5:配列arrayを読み込む
6:tempにarray[0][A-1]を代入する(スプレッドシートは2次元配列)
7.array[0][A-1]をarray[0][B-1]で置き換える
8.array[0][B-1]をtempで置き換える
9.ループで置き換え後のarrayを出力する

手順1,2,3,4:A,B,Nを読み込む
const sheet=SpreadsheetApp.getActiveSheet();
let A=sheet.getRange(1,2).getValue();
let B=sheet.getRange(2,2).getValue();
let N=sheet.getRange(3,2).getValue();

手順5:配列aを読み込む
let a=sheet.getRange(5,2,1,N).getValues();

ログを使って確認
console.log(array);

手順6:tempにarray[0][A-1]を代入する(スプレッドシートは2次元配列)
let temp;
temp=array[0][A-1];

手順7.array[0][A-1]をarray[0][B-1]で置き換える
array[0][A-1]=array[0][B-1];

手順8.array[0][B-1]をtempで置き換える
array[0][B-1]=temp;

置き換え後の配列をログで確認
console.log(array);

手順9.ループで置き換え後のarrayを出力する
sheet.getRange(8,2,1,N).setValues(array);

実行結果です。8行目の黄色いセルに入っています。

GAS の全コードです。

function arraytemp(){

  const sheet=SpreadsheetApp.getActiveSheet();

  //配列のA番目(左から2番目)を取得
  let A=sheet.getRange(1,2).getValue();

  //配列のB番目(左から3番目)を取得
  let B=sheet.getRange(2,2).getValue();

  //配列の要素数Nを取得
  let N=sheet.getRange(3,2).getValue();

  //配列arrayを取得 (5,2)からN=5行
  let array=sheet.getRange(5,2,1,N).getValues();

  console.log(array);

  let temp;
  temp=array[0][A-1];
  array[0][A-1]=array[0][B-1];
  array[0][B-1]=temp;

  console.log(array);
  
  sheet.getRange(8,2,1,N).setValues(array);
  


}

お疲れ様でした。

ブレイクタイムフォトはこちらになります。

青山フラワーマーケット

参考文献です。

GAS自作サンプル集に戻る
Python自作サンプル集に戻る
息抜きに、写真で癒し(=^x^=)

基本情報技術者試験
自己紹介

GASとPythonで、paiza レベルアップ問題集 配列メニュー を解いてみた4

このコーナーでは、学習コンテンツpaizaのレベルアップ問題集の中から気になった問題をPythonとGASの両方で解いてみます。

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

問題文URL:【配列の書き換え (paizaランク D 相当)】

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

N個の配列の中にAという要素があったら、それをBに置き換える問題です。
A,B,Nは標準入力1行目に与えられます。

要素数N個の配列aが、標準入力2行目に与えられます。

Nが配列aの中に何個あるのか調べます。

この問題の具体例は、

入力例1
3 1 5
1 2 3 4 5

出力例1
1
2
1
4
5

入力例1行目の標準入力1行目より、探す要素A=3、置換する要素はB=1,配列の要素数N=5となります。
入力例2行目の標準入力より、配列aは1,2,3,4,5となります。

出力例より、置換後の配列aは1,2,1,4,5となり、3が1に置換されます。

手順として、
1.A,B,Nを読み込む
2.配列aを読み込む
3.ループで配列aの各要素を調べる
4.IF文でもしもa[i]がAだったら、a[i]をBに置き換える
5.置換後の配列aを出力する
と、なります。

コードを見てみましょう。

手順1:A,B,Nを読み込む
A,B,N=map(int,input().rstrip().split(‘ ‘))

手順2:配列aを読み込む
a=list(map(int,input().rstrip().split(‘ ‘)))

手順3:ループで配列aの各要素を調べる
手順4:IF文でもしもa[i]がAだったら、a[i]をBに置き換える

for i in range(N):
    if a[i]==A:
        a[i]=B

手順5:置換後の配列aを出力する

for num in a:
    print(num)

全コードはこのようになります。


'''
N個の配列aのうち、
要素がAのものをBに書き換える 

A B N
a_1 a_2 ... a_N

'''

A,B,N=map(int,input().rstrip().split(' '))
a=list(map(int,input().rstrip().split(' ')))

for i in range(N):
    if a[i]==A:
        a[i]=B

for num in a:
    print(num)

では、同じ問題をGASで解いてみます。

まず、スプレッドシートにこの様に配置しました。

置換前の要素AをB1、置換後の要素BをB2、配列の要素数NをB3に表示しました。
置換前の配列aをB5からF5、置換後の配列aをB7からF7に表示しました。

手順はこのようになります。
1:置換前の要素Aを読み込む
2:置換後の要素Bを読み込む
3:配列aの要素数Nを読み込む
4:配列aを読み込む
5:ループとIF文で要素AをBに置き換える
6:置換後の配列aを出力する

手順1,2,3:A,B,Nを読み込む
const sheet=SpreadsheetApp.getActiveSheet();
let A=sheet.getRange(1,2).getValue();
let B=sheet.getRange(2,2).getValue();
let N=sheet.getRange(3,2).getValue();

ログを使ってA,B,Nが読み込めたことを確認
console.log(A);
console.log(B);
console.log(N);

手順4:配列aを読み込む
let a=sheet.getRange(5,2,1,N).getValues();

ログを使って配列aが読み込めたことを確認
console.log(a);

手順5:ループとIF文で要素AをBに置き換える

  for(let i=0;i<N;i++){
    if(a[0][i]==A){
      a[0][i]=B
    }
  }

a[0][i]となっているのは、スプレッドシート上で二次元配列として扱っているので、配列aの0行目のi列目をループで回してIFで調べています。

ログで配列Aが書き換えられたことを確認
console.log(a)

手順6:置換後の配列aを出力する
sheet.getRange(7,2,1,N).setValues(a);

実行結果です。

全コードはこの様になります。


function arrayReplacement(){
  const sheet=SpreadsheetApp.getActiveSheet();
  let A=sheet.getRange(1,2).getValue();
  let B=sheet.getRange(2,2).getValue();
  let N=sheet.getRange(3,2).getValue();

  console.log(A);
  console.log(B);
  console.log(N);

  let a=sheet.getRange(5,2,1,N).getValues();
  console.log(a);

  for(let i=0;i<N;i++){
    if(a[0][i]==A){
      a[0][i]=B
    }
  }

  console.log(a)

  sheet.getRange(7,2,1,N).setValues(a);

}

お疲れ様でした。

ブレイクタイムフォトはこちらになります。

横浜ランドマークタワーから撮った、みなとみらいの夜景

参考文献です。

GAS自作サンプル集に戻る
Python自作サンプル集に戻る
息抜きに、写真で癒し(=^x^=)

基本情報技術者試験
自己紹介

GASとPythonで、paiza レベルアップ問題集 配列メニュー を解いてみた3

このコーナーでは、学習コンテンツpaizaのレベルアップ問題集の中から気になった問題をPythonとGASの両方で解いてみます。

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

問題文URL:【配列の検索】何個ある? Boss (paizaランク D 相当)

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

配列の中にNという数が何個あるのか調べます。
配列の要素数はMです。
それらが標準入力1行に与えられます。

要素数M個の配列をaが、標準入力2行目に与えられます。

Nが配列aの中に何個あるのか調べます。

この問題の具体例は、

入力例1
1 5
1 1 1 2 2

出力例1
3

なので、N=1,M=5、配列aは1,1,1,2,2となります。

手順として、
1.NとMを読み込む
2.配列aを読み込む
3.Nは配列aの中に何回登場するのかを求める。

と、なります。

コードを見てみましょう。

手順1:調べる数Nと配列の要素数を読み込む
N,M=map(int,input().rstrip().split(‘ ‘))

手順2:配列aを読み込む
a=list(map(int,input().rstrip().split(‘ ‘)))

手順3:Nは配列aの中に何回登場するのか調べる
print(a.count(N))

配列名.count(登場回数を調べる要素)で、Nは配列aに何回登場するのかを求めています。

全コードはこのようになります。

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

print(a.count(N))

では、同じ問題をGASで解いてみます。

まず、スプレッドシートにこの様に配置しました。

配列の何番目なのか調べる数NをB1、配列の個数MをB2、配列をB4からF4までM個分=この場合5個
Nが配列aの何番目にあるのかをB6に表示させます。

手順はこのようになります。
1:配列の左から何番目にあるのか調べる数Nを読み込む
2:配列の要素数Mを読み込む
3:配列aを読み込む
4:Nが配列aの左から何番目に登場するのか求めて結果を表示する
5:Nの登場回数をシートのB6に出力する

手順1,2:N,Mを読み込む
const sheet=SpreadsheetApp.getActiveSheet();
let N=sheet.getRange(1,2).getValue();
let M=sheet.getRange(2,2).getValue();

手順3:配列aを読み込む
let a=sheet.getRange(4,2,1,M).getValues();

B4から1行分、M列分取得しています。

console.log(N);
console.log(M);
console.log(a)

で、N,Mと配列aがきちんと読み込めたかどうか確認するために、ログに表示しました。

手順4:Nが配列aの中に何回登場するのか求めて結果を表示する
Nの出現回数を数える変数をNcountとします。
二次元配列a[0][0]からa[0][4]までNと同じかどうか調べています。
同じの場合はNcountをインクリメントしています。

let Ncount=0;
  for (let i=0;i<M;i++){
    if (a[0][i]===N){
      Ncount++
    }
  }
  console.log(Ncount);

ログです。

手順5:Nの登場回数をシートのB6に出力する
sheet.getRange(6,2).setValue(Ncount);

実行結果です。

全コードはこの様になります。

function whatCount(){
  const sheet=SpreadsheetApp.getActiveSheet();
  let N=sheet.getRange(1,2).getValue();
  let M=sheet.getRange(2,2).getValue();

  let a=sheet.getRange(4,2,1,M).getValues();

  console.log(N);
  console.log(M);
  console.log(a)

  let Ncount=0;
  for (let i=0;i<M;i++){
    if (a[0][i]===N){
      Ncount++
    }
  }
  console.log(Ncount);
  sheet.getRange(6,2).setValue(Ncount);

}

お疲れ様でした。

ブレイクタイムフォトはこちらになります。

お台場 自由の女神

参考文献です。

GAS自作サンプル集に戻る
Python自作サンプル集に戻る
息抜きに、写真で癒し(=^x^=)

基本情報技術者試験
自己紹介

GASとPythonで、paiza レベルアップ問題集 配列メニュー を解いてみた2

このコーナーでは、学習コンテンツpaizaのレベルアップ問題集の中から気になった問題をPythonとGASの両方で解いてみます。

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

問題文URL:何番目にある? 3 (paizaランク D 相当)

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

配列の中にNという数が左から何番目にあるのか調べます。
配列の要素数はMです。
それらが標準入力1行に与えられます。

要素数M個の配列をaとします。aが標準入力2行目に与えられます。

Nが配列aの左から何番目なのか調べます。

この問題の具体例は、

入力例1
3 5
1 2 3 4 5

出力例1
3

なので、N=3,M=5、配列aは1,2,3,4,5となります。

手順として、
1.NとMを読み込む
2.配列を読み込む
3.Nは配列aの左から何番目に登場するのか調べる

と、なります。

コードを見てみましょう。

手順1:調べる数Nと配列の要素数を読み込む
N,M=map(int,input().rstrip().split(‘ ‘))

手順2:配列aを読み込む
a=list(map(int,input().rstrip().split(‘ ‘)))

配列をきちんと読み込めたか出力して、確認後はコメントアウトしています。
#print(a)

手順3:Nは配列aの左から何番目に登場するのか調べる
print(a.index(N)+1)

配列名.index(順番を調べる要素)で、Nが左から何番目にあるのか求めています。
1を加えているのは、配列の先頭が0から始まるからです。

全コードはこのようになります。

N,M=map(int,input().rstrip().split(‘ ‘))
a=list(map(int,input().rstrip().split(‘ ‘)))
#print(a)
print(a.index(N)+1)

では、同じ問題をGASで解いてみます。

まず、スプレッドシートにこの様に配置しました。

配列の何番目なのか調べる数NをB1、配列の個数MをB2、配列をB4からF4までM個分=この場合5個
Nが配列aの何番目にあるのかをB6に表示させます。

手順はこのようになります。
1:配列の左から何番目にあるのか調べる数Nを読み込む
2:配列の要素数Mを読み込む
3:配列aを読み込む
4:Nが配列aの左から何番目に登場するのか求めて結果を表示する

手順1,2:N,Mを読み込む
const sheet=SpreadsheetApp.getActiveSheet();
let N=sheet.getRange(1,2).getValue();
let M=sheet.getRange(2,2).getValue();

手順3:配列aを読み込む
let a=sheet.getRange(4,2,1,M).getValues();

B4から1行分、M列分取得しています。

console.log(a);
で、配列が読み込めたかどうかログに表示しました。

手順4:Nが配列aの左から何番目に登場するのか求めて結果を表示する
console.log(a[0].indexOf(N)+1);
sheet.getRange(6,2).setValue(a[0].indexOf(N)+1);

a[0]はスプレッドシート上で二次元配列となっていてその1行目であるa[0]の中で、
Nが左から何番目にあるのか求めて、配列の先頭が0で始まるので1を加えています。

そのログ表示とシートのB6に表示されるコードです。

全コードはこの様になります。

function inWhatNumber(){
const sheet=SpreadsheetApp.getActiveSheet();
let N=sheet.getRange(1,2).getValue();
let M=sheet.getRange(2,2).getValue();
let a=sheet.getRange(4,2,1,M).getValues();
console.log(a);
console.log(a[0].indexOf(N)+1);
sheet.getRange(6,2).setValue(a[0].indexOf(N)+1);
}

実行結果です。

お疲れ様でした。

ブレイクタイムフォトはこちらになります。

スカイツリー

参考文献です。

GAS自作サンプル集に戻る
Python自作サンプル集に戻る
息抜きに、写真で癒し(=^x^=)

基本情報技術者試験
自己紹介

GASとPythonで、paiza レベルアップ問題集 配列メニュー を解いてみた1

このコーナーでは、学習コンテンツpaizaのレベルアップ問題集の中から気になった問題をPythonとGASの両方で解いてみます。

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

問題文URL:配列に含まれている? 3 (paizaランク D 相当)

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

標準入力の1行目は配列の要素数がNで、調べる数がM、
標準入力の2行目は配列自体が入力されます。
配列をaとします。Mがaの中にあったら’Yes’,無かったら’No’と表示します。
この問題の具体例は、

入力例1
5 1
1 2 3 4 5

出力例1
Yes

なので、N=5,M=1、配列aは1,2,3,4,5となります。

手順として、
1.NとMを読み込む
2.配列を読み込む
3.配列aの中にMが入っているかどうか調べる

になります。

コードを見てみましょう。

手順1:NとMを読み込む
N,M=map(int,input().rstrip().split(‘ ‘))

手順2:配列aを読み込む
a=list(map(int,input().rstrip().split(‘ ‘)))

手順3:配列aの中にMがあるかどうか調べます。
if M in a:
print(‘Yes’)
else:
print(‘No’)

全コードはこのようになります。

N,M=map(int,input().rstrip().split(‘ ‘))
a=list(map(int,input().rstrip().split(‘ ‘)))
if M in a:
 print(‘Yes’)
else:
 print(‘No’)

N,M=map(int,input().rstrip().split(' '))
a=list(map(int,input().rstrip().split(' ')))
if M in a:
 print('Yes')
else:
 print('No')

では、同じ問題をGASで解いてみます。

まず、スプレッドシートにこの様に配置しました。

配列の個数NをB1、調べる数MをB2、配列をB4からF4までN個分=この場合5個
Mが配列aにあるかどうかの判定結果をB6に表示させます。

手順はこのようになります。
1:要素数Nを読み込む
2:調べる数Mを読み込む
3:判定結果jadgeを「No」にしておく
4:配列aを読み込む
5:配列aにMがあるかどうか調べる
6.判定結果を表示する。

手順1,2
sheet=SpreadsheetApp.getActiveSheet();
let N=sheet.getRange(1,2).getValue();
let M=sheet.getRange(2,2).getValue();

手順3
let jadge=’No’;
まずはjadgeというフラグを「No」にして、Mがaの中に存在したら「Yes」で書き換えます。

手順4
let a=sheet.getRange(4,2,1,N).getValues();
配列を読み込んでいます。
B4は(4,2)で表され、行は1、列はN個分確保します。

手順5
配列の先頭は0から始まり、N=5の場合、0,1,2,3,4で5より小さい間のループを作ります。
スプレッドシートの配列は二次元配列なので、1行目はa[0][1]からa[0][4]までです。
もしもa[0][i]がMと一致したら、フラグjadgeを「Yes」に書き換えてループを抜けます。



for(let i=0;i<N;i++){
if(a[0][i]==M){
jadge=’Yes’
break;

手順6
最後に判定結果をセルB6に入れます。
sheet.getRange(6,2).setValue(jadge);

全コードはこの様になります。

function myFunction() {
sheet=SpreadsheetApp.getActiveSheet();
let N=sheet.getRange(1,2).getValue();
let M=sheet.getRange(2,2).getValue();
let jadge=’No’;
let a=sheet.getRange(4,2,1,N).getValues();
for(let i=0;i<N;i++){
if(a[0][i]==M){
jadge=’Yes’
break;
}
}
sheet.getRange(6,2).setValue(jadge);
}

お疲れ様でした。

ブレイクタイムフォトはこちらになります。

2019年東京都板橋区 いたばし花火大会

参考文献です。

GAS自作サンプル集に戻る
Python自作サンプル集に戻る
息抜きに、写真で癒し(=^x^=)

基本情報技術者試験
自己紹介

オオタニサン!!大谷翔平の目標シート(マンダラチャート)をスプレッドシートにGASでマクロを使って作ってみた

この記事を読むことによって、GAS(Google Apps Script)を使って、スプレッドシートに太枠の罫線を引く・セルの色を塗りつぶす・シートの書式を全てクリアする、といった処理を、二重ループなどを使うことによって詳細に学習できます。

また、剰余演算子、スプレッドシートにボタンを追加してマクロを割り当てて、更にボタンを複製する方法も触れております。

ループが二重になってくるとコードが複雑になってくるので、エディターのコードの部分を選択して右クリックして、「選択範囲のフォーマット」をクリックするとコードが整形できます。

今回の具体例として、満場一致でMVPを取得した二刀流で有名なメジャーリーガー、エンジェルスの大谷翔平選手が、高校時代に愛用していたマンダラチャート(目標シート)のフォーマットをスプレドシートに自動で作成出来るマクロをGASでプログラミングしました。

「オオタニサン」こと大谷翔平選手が高校時代にドラフト1位で8球団から指名されることを目標にして作ったマンダラチャートがこちらになります。

大谷翔平選手が使っていた目標達成シート(マンダラチャート)とは? 作り方、目標達成シートを作る場合の注意点について

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

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

マンダラチャートは規則性があるので、GASに限らずExcel VBAなどのマクロの練習には打って付けだと思います。

私の場合ですが、こんな感じに仕上がりました。

関数はグローバル関数と、ローカル関数を4つ使っていきます。
グローバル関数(どこからでも参照できる関数)は、SpreadSheetAppから辿ってアクティブドシートにアクセスするコードを書きました。

//グローバル関数でSpreadsheetAppからアクティブシートにアクセスする
const ss=SpreadsheetApp.getActiveSheet();

以降はローカル関数になります。
ローカル関数はスプレッドシート内でボタンを作って関数を登録しています。

ローカル関数1つ目:太枠線を囲う。

この関数の完成形のシートを掲載します。

上のシートを見ると分かるように、1行目の1列目、4列目、7列目と、3で割って1余る行と列を起点として太枠が描かれています。
太枠はThick Borderなので、それにちなんだ関数名「thickBorder」を付けています。

//太枠線を引く関数
function thickBorder() {

  /*枠線は、
  1行目の1列目、4列目、7列目、
  4行目の1列目、4列目、7列目、
  7行目の1列目、4列目、7列目
  と、3で割って1余るセルを基点として、3行3列分設定されている
  */

  for(let i=1;i<=9;i++){
    for (let j=1;j<=9;j++){
      if(i%3==1 && j%3==1){
        let cell=ss.getRange(i,j,3,3);
        cell.setBorder(true,true,true,true,null,null,'black',SpreadsheetApp.BorderStyle.SOLID_THICK);
      }
    }
  }
}

この関数をボタンに登録します。
ボタンはスプレッドシートの挿入メニュー→図形描画でこの画面が出てくるので、下の赤枠をクリックして、好きな形を選びます。

図形を選択した状態で、「太枠線を引く」などのボタン名を入力します。

また、図形を選択しているその状態で、下記の図の緑の「保存して終了」ボタンの下にあるの赤枠の「・・・」ボタンを押すと詳細な設定が可能になります。

その中でも良く使う処理が「ボタン名を中央揃えにする」処理だと思いますので、下記の図の赤枠内で任意の設定を行います。ここで、水平・垂直の文字の位置が調整出来ます。

あとはボタンの色や太さ、フォントの大きさなどをお好みに設定して、右上の緑の「保存して終了」を押します。

スプレッドシートに戻るので、ボタンを選択して(【すでに関数が登録されている場合は】間違ってボタンを押して実行しまわないように必ず【右クリック】で選択)、右上の「・・・」から「スクリプトの割り当て」を選んで、この場合は「thickBorder」と入力します。

これで、このボタンをポチると、スプレッドシートに太枠線が表示されました。
(スクリプト 何々関数が見つかりませんでした、というエラーを防ぐために、前もって関数名をコピペしておくと便利かもしれません。)

ローカル関数2つ目:各太枠の中央のセルを薄黄色に塗りつぶす

完成形のシートです。

上図の様に濃い黄色に塗り潰す対象は、
2行目の2列目、5列目、8列目、
5行目の2列目、8列目、
8行目の2列目、5列目、8列目
です。
(5行目の5列目はど真ん中で別の色に指定するので、今回は対象外)

今回塗りつぶしの色として指定する濃い黄色は、「#ffee00」と設定します。
これはRGB形式なので、最初のffで赤を最強、次のeeで緑を割と強め、最後の00で青を最弱、という設定にしています。
因みに白が#ffffffで、黒が#000000です。

濃い黄色はDark Yellowなので、それにちなんだ関数名「darkYellow」にしています。

スプレッドシートのボタンを複製するには、まず最初に作ったボタンを右クリックして、ボタン右上の「・・・」をクリックして編集を押し、図形描画画面からボタンをクリックして【control】+【C】でコピーしてから一旦右上の緑の「保存して終了」を押します。(Macの方は【command】ボタン)

面倒ですが、もう一度スプレッドシート画面に戻って、挿入→図形描画画面で、【control】+【V】で貼り付けてボタンの文字を「濃い黄色に塗りつぶし」と変えます。

このローカル関数darkYellowのコードです。

//ど真ん中を除く各太枠の中央を濃い黄色に塗り潰す関数
function darkYellow() {

  /*
  濃い黄色(#ffee00)に塗り潰す対象は、
  2行目の2列目、5列目、8列目、
  5行目の2列目、      8列目、
  8行目の2列目、5列目、8列目です。
  */

  for (let i = 1; i <= 9; i++) {
    for (let j = 1; j <= 9; j++) {
      if (i != 5 || j != 5) {
        if (i % 3 == 2 && j % 3 == 2) {
          ss.getRange(i, j).setBackground('#ffee00');
        }
      }
    }
  }

}

ローカル関数3つ目:ど真ん中のエリアの塗りつぶし

今度はど真ん中の太枠セル内を薄い黄色に塗りつぶしをして、更にその中央をオレンジ色にします。
薄い黄色を「#ffff88」、オレンジを「#ffd400」としました。
このローカル関数を「centerArea」にします。

完成形のシートとコードです。


//ど真ん中の太枠を薄黄色に塗りつぶしてから、その中央を濃いオレンジに塗りつぶす
function centerArea(){
  ss.getRange(4,4,3,3).setBackground('#ffff88');
  ss.getRange(5,5).setBackground('#ffd400');
}

ローカル関数4つ目:書式をクリア

最後はこのシートの書式のみをクリアします。
完成形はこちらになります。

このローカル関数をmyClearに致しました。

//シートの書式をクリアにする
function myClear(){
  ss.clearFormats();
}

ここまでのプログラムを全てまとめます。

//グローバル関数でSpreadsheetAppからアクティブシートにアクセスする
const ss=SpreadsheetApp.getActiveSheet();

//ローカル関数その1:太枠線を引く関数
function thickBorder() {

  /*枠線は、
  1行目の1列目、4列目、7列目、
  4行目の1列目、4列目、7列目、
  7行目の1列目、4列目、7列目
  と、3で割って1余るセルを基点として、3行3列分設定されている
  */

  for(let i=1;i<=9;i++){
    for (let j=1;j<=9;j++){
      if(i%3==1 && j%3==1){
        let cell=ss.getRange(i,j,3,3);
        cell.setBorder(true,true,true,true,null,null,'black',SpreadsheetApp.BorderStyle.SOLID_THICK);
      }
    }
  }
}

//ローカル関数その2:ど真ん中を除く各太枠の中央を濃い黄色に塗り潰す関数
function darkYellow() {

  /*
  濃い黄色(#ffee00)に塗り潰す対象は、s
  2行目の2列目、5列目、8列目、
  5行目の2列目、      8列目、
  8行目の2列目、5列目、8列目です。
  */

  for (let i = 1; i <= 9; i++) {
    for (let j = 1; j <= 9; j++) {
      if (i != 5 || j != 5) {
        if (i % 3 == 2 && j % 3 == 2) {
          ss.getRange(i, j).setBackground('#ffee00');
        }
      }
    }
  }

}

//ローカル関数その3:ど真ん中の太枠を薄黄色に塗りつぶしてから、その中央を濃いオレンジに塗りつぶす
function centerArea(){
  ss.getRange(4,4,3,3).setBackground('#ffff88');
  ss.getRange(5,5).setBackground('#ffd400');
}

//ローカル関数その4:シートの書式をクリアにする
function myClear(){
  ss.clearFormats();
}

お疲れ様でした。
すごく長くなって冗長な所もあったと思いますがご精読、大変にありがとうございます。私も優秀な方からは年齢関係なくこれからも沢山学んで吸収して行きます!!

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

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

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

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

episode8(最終回) GASの「キャラの身長をシンプルなグラフ化する」(Hunter×Hunterで覚えるGoogle Apps Script)

この記事を読むことによって、GAS(Google Apps Script)の最も基礎的な縦棒グラフの作り方が学べます。
このコーナーではGASをアニメ、ハンターハンターを通して入門の入門から学べる記事を掲載しております。

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

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

まず、前回(episode7)の復習をします。

セルに「平均」、「170cm以上の人数」と入力し、平均身長と該当する人数を求めています。


この身長のデータは、HUNTER×HUNTER(ハンターハンター)の主要キャラクターの設定を用いました。

前回のコードです。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//身長の平均と170cm以上の人数を求める関数
function height(){
  ss.getRange(6,1).setValue('平均');
  ss.getRange(7,1).setValue('170cm以上の人数');

  //平均身長を計算
  ss.getRange(6,2).setFormula('=AVERAGE(D1:D4)');

  //身長が170cm以上のキャラクターの人数を求める
  ss.getRange(7,2).setFormula('=COUNTIF(D1:D4,">=170")');
}

今回は、「キャラクター名」と「身長」の最も簡単な縦棒グラフを作ります。
名前の範囲をセルA1から4行分取得して、定数nameに格納します。

const name=ss.getRange(1,1,4);

身長の範囲をセルD1から4行分取得して、chara_heightとします。

const chara_height=ss.getRange(1,4,4);

以下、「chart」というグラフを作る処理になります。
ここまでで、上記のnameと、chara_heightを追加します。

let chart=ss.newChart()
    .asColumnChart()//単純な縦棒グラフ
    .addRange(name)//名前を追加
    .addRange(chara_height) //身長を追加

セルA10から縦横に10ドット下がった位置に配置し、高さ300、幅400のグラフを指定します。

.setPosition(10,1,10,10)//セルA10からタテ・ヨコ10ドット下がった所に配置
    .setOption('height',300)//グラフの高さを設定
    .setOption('width',400)//グラフの幅を設定
    .build()//グラフを作る

最後にグラフchartをアクティブなスプレッドシートに追加します。

ss.insertChart(chart);

ここまでのコードです。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//キャラクター名と身長の単純な縦棒グラフを作る
function myGraph(){
  
  //キャラクターの名前を定数nameに格納する
  const name=ss.getRange(1,1,4);

  //キャラクターの身長を定数chara_heightに格納する
  const chara_height=ss.getRange(1,4,4);

  
  //グラフを作る処理
  let chart=ss.newChart()
    .asColumnChart()//単純な縦棒グラフ
    .addRange(name)//名前を追加
    .addRange(chara_height) //身長を追加
    .setPosition(10,1,10,10)//セルA10からタテ・ヨコ10ドット下がった所に配置
    .setOption('height',300)//グラフの高さを設定
    .setOption('width',400)//グラフの幅を設定
    .build()//グラフを作る
    
    //アクリティブなスプレッドシートにグラフchartを追加する
    ss.insertChart(chart);

}

それでは、マクロを実行します。

スプレッドシートに切り替えて、拡張機能→マクロ→関数を追加で指定のマクロ(今回でいえば、myGraph)をインポートします。

再び拡張機能→マクロから「myGraph」を選んで実行します。

グラフが表示されました。

お疲れ様でした。
入門講座はここで最後になります。
最終回までご覧いただき、ありがとうございました(=^x^=)mm

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

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

←episode7

←GAS自作サンプルへ戻る

episode7 GASの「キャラの身長で演算(平均・条件に該当する数のカウント)」(Hunter×Hunterで覚えるGoogle Apps Script)

この記事を読むことによって、GAS(Google Apps Script)で計算結果を格納する方法を学べます。今回は平均を求めるAVERAGEと条件に該当する人数を数えるCOUNTIF関数を使います。また、文字入力の復習も出来ます。

Excelが分かれば、すんなり納得されると思います。

このコーナーではGASをアニメ、ハンターハンターを通して入門の入門から学べる記事を掲載しております。

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

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

前回(episode6)の復習をします。

ハンター試験ルーキーのキャラクターのセルの背景や文字の色を設定しました。
そのコードと実行結果です。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//セルの背景色とフォントを変える
function rookieColor(){

  //A列B列の名前と念系統が入っているセル範囲をcelDATAと定義
  const cellDATA=ss.getRange(1,1,4,2);

  //背景色を黒にする
  cellDATA.setBackground('black');

  //文字を白にする
  cellDATA.setFontColor('white');

  //C列のヒソカチェックのセル範囲をcellHISOKAと定義
  const cellHISOKA=ss.getRange(1,3,4);

  //背景を薄紫にする
  cellHISOKA.setBackground('#eeddee');

}

今回は、この一つ右のセルにキャラクターの身長を入力して、平均を求めてみたいと思います。(下の表のD列にゴンからレオリオまでの身長を入れました。)

それで、まずはこの表の下のセルA6に「平均」といいう文字を入れてみます。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//身長の平均と170cm以上の人数を求める関数
function height(){
  ss.getRange(6,1).setValue('平均');
}

この様に文字が入りました。

また、この1つ下のセルA7に「170cm以上の人数」の文字を入れます。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//身長の平均と170cm以上の人数を求める関数
function height(){
  ss.getRange(6,1).setValue('平均');
  ss.getRange(7,1).setValue('170cm以上の人数');
}

少しA列を広げました。

今度は、セルB6に平均身長を求めます。

ss.getRange(6,2).setFormula(‘=AVERAGE(D1:D4)’);

この様に、setFormula(‘=関数(セル範囲)’);で求まります。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//身長の平均と170cm以上の人数を求める関数
function height(){
  ss.getRange(6,1).setValue('平均');
  ss.getRange(7,1).setValue('170cm以上の人数');

  //平均身長を計算
  ss.getRange(6,2).setFormula('=AVERAGE(D1:D4)');
}

最後に、セルB7に身長が170cm以上のキャラクターの人数を求めます。

ss.getRange(7,2).setFormula(‘=COUNTIF(D1:D4,”>=170″)’);

この様に、setFormula(‘COUNTIF関数(=セル範囲,”カウントする条件”)’);で求まります。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//身長の平均と170cm以上の人数を求める関数
function height(){
  ss.getRange(6,1).setValue('平均');
  ss.getRange(7,1).setValue('170cm以上の人数');

  //平均身長を計算
  ss.getRange(6,2).setFormula('=AVERAGE(D1:D4)');

  //身長が170cm以上のキャラクターの人数を求める
  ss.getRange(7,2).setFormula('=COUNTIF(D1:D4,">=170")');
}

この様に、求まりました。ご精読ありがとうございました。

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

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

←episode6               episode8(最終回)→

←GAS自作サンプルへ戻る

episode6 GASの「指定したセル範囲に色を付ける」(Hunter×Hunterで覚えるGoogle Apps Script)

この記事を読むことによって、GAS(Google Apps Script)でスプレッドシートの指定の範囲のセル背景やフォントに色を付けることを学べます。
GASをアニメ、ハンターハンターを通して入門の入門から学べる記事を掲載しております。

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

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

前回(episode5)の復習をします。

スプレッドシートA列にある、ハンター試験ルーキーのキャラクター名のフォントを大きくしたり、文字を太くしたりしました。

そのコードと結果です。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//キャラクターの名前を12ptの太字にする
function Bold12pt(){

  const N=ss.getLastRow();
  let cellROOKIE=ss.getRange(1,1,N);
  cellROOKIE.setFontSize(12).setFontWeight('bold');

}

今回は、この表に色を付けます。
イメージとしては、厨二病っぽい感じにしたいと思います。

各キャラクターの名前(列A)と念系統(列B)を黒背景に白文字に、
ヒソカチェックの列(列C)は、紫にします。

列ABの4行2列分の範囲をcellDATAと定義します。

//A列B列の名前と念系統が入っているセル範囲をcelDATAと定義
let cellDATA=ss.getRange(1,1,4,2);

背景色を黒にしています。

cellDATA.setBackground(‘black’);

文字の色を白にしています。

cellDATA.setFontColor(‘white’);

列Cの4行1列分の範囲をcellHISOKAという名前にします。

//C列のヒソカチェックのセル範囲をcellHISOKAと定義
let cellHISOKA=ss.getRange(1,3,4);

白がffffff、黒が000000で、最初の2桁が赤、次が緑、最後が青なので、薄紫を[eeddee]で表しました。
このコードでは、赤と青を強めにしていて、薄い紫になります。

cellHISOKA.setBackground(‘#eeddee’);

ここまでのコードです。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//セルの背景色とフォントを変える
function rookieColor(){

  //A列B列の名前と念系統が入っているセル範囲をcelDATAと定義
  const cellDATA=ss.getRange(1,1,4,2);

  //背景色を黒にする
  cellDATA.setBackground('black');

  //文字を白にする
  cellDATA.setFontColor('white');

  //C列のヒソカチェックのセル範囲をcellHISOKAと定義
  const cellHISOKA=ss.getRange(1,3,4);

  //背景を薄紫にする
  cellHISOKA.setBackground('#eeddee');

}

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

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

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

←episode5               episode7→

←GAS自作サンプルへ戻る