Skip to content

Instantly share code, notes, and snippets.

@yano3nora
Last active September 14, 2022 23:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yano3nora/60e44b84261e942446cd4f6150181c8f to your computer and use it in GitHub Desktop.
Save yano3nora/60e44b84261e942446cd4f6150181c8f to your computer and use it in GitHub Desktop.
[gas: Google Spreadsheets] Google Spreadsheets note. #gas #js

Google オフラインドキュメント Extension

https://chrome.google.com/webstore/detail/google-docs-offline/ghbmnnjooekpmoecnnnilnnbdlolhkhi

  • オフラインでも spreadsheet 開けるようにするやつ
  • 異なる sheet 間で「コピー => 値のみ貼り付け」とかの追加機能拡張もある

一括結合解除

なんか普通にだとできにゃい。多分「結合を解除」を選択できるようにしてから範囲選択 ... ってのが必要。GAS はいらない。

  1. どこでもいいので結合セルを選択
  2. その状態で cmd + a などで範囲選択
  3. あとは普通に「結合を解除」が選択できるので解除する

関数の追加

ハッシュ関数

Google Spreadsheetでハッシュ関数を使う

/**
 * =SHA256(A1&B1&C1) みたいに使う
 */
function SHA256(input) {
  var rawHash = Utilities.computeDigest(
    Utilities.DigestAlgorithm.SHA_256,
    input,
    Utilities.Charset.UTF_8,
  );

  var txtHash = '';
  for (i = 0; i < rawHash.length; i++) {
    var hashVal = rawHash[i];
    if (hashVal < 0) {
      hashVal += 256;
    }
    if (hashVal.toString(16).length == 1) {
      txtHash += '0';
    }
    txtHash += hashVal.toString(16);
  }
  return txtHash;
}

範囲ソート

https://www.wikihow.com/Sort-by-Multiple-Columns-in-Google-Spreadsheets

  1. 範囲選択
  2. データ→範囲を並べ替え
  3. 優先列から順に ASC / DESC を選択

関数

https://support.google.com/docs/table/25273?hl=ja&ref_topic=3105625
http://blog.otakumode.com/2015/09/25/startup-paji-spreadsheet/

ArrayFormula

https://support.google.com/docs/answer/3093275?hl=ja

配列数式から返された値を複数行または複数列に表示したり、非配列関数で配列を使用したりすることができます。

countif で「現在行までのカウント」を取って枝番的なことしたい

googleスプレッドシートでCOUNTIFの関数をARRAYFORMULAを使用して1回で出したい

countifs で範囲条件に「一個前までの」を追加してやるぽい。

A1   | B2
---- | ----
100 | 100-1
100 | 100-2
100 | 100-3 // こんな感じで A 列のカウントで枝番作る
200 | 200-1
200 | 200-2
300 | 300-1
300 | 300-2


=arrayformula(
  if(
    (A:A<>""),
    A:A&"-"&countifs(row(A:A), "<="&row(A:A), A:A, A:A),
    ""
  )
)

AND, OR 的なことをやりたい

(Gスプレッドシート)AND,OR+ARRAYFORMULA関数のはたらき

# こんな感じのことしたいけど and は配列処理で結果をまとめて
# bool 評価するので全部が true じゃないと true にならない
#
=arrayformula(if(and(A:A<>"", B:B<>""), "ok", "ng"))

# () で評価しつつ * で結果をかけ合わせて 1 or 0 にして and を表現する
# or は + でつなぐ
#
=arrayformula(if((A:A<>"") * (B:B<>""), "ok", "ng"))

連番を自動でいれるやつ

=ARRAYFORMULA(row(A2:A)-1)

空白だったら一番近い ↑ セルで埋めるやつ

Array Formula to Fill Blank Cells With the Values Above in Google Sheets

いみわからん。

# B 列の 3 行目から ↓ みたいになっているとき
# C 列で B 列の内容を上セルでデータ補完 (穴埋め) する
#
# A   | B     | C
# --- | ----- | ---
#     |       | 
#     |       | 
#     | test1 | test1
#     |       | test1
#     | test2 | test2
#     | test3 | test3
#     |       | test3
#     | test4 | test4
#     |       | test4

=ArrayFormula(iferror(if(row(C3:C)-countblank(C3:C)<=MATCH(2,1/(C:C<>""),1),lookup(row(B3:B),row(B3:B)/if(C3:C<>"",TRUE,FALSE),B3:B),),""))
# 左が空白のときだけ表示させて、階層っぽくみせる、とか
#
# A   | B     | C
# --- | ----- | ---
#     |       | 
#     |       | 
#     | test1 | 
#     |       | test1
#     |       | test1
#     | test2 |
#     | test3 |
#     |       | test3
#     | test4 | 
#     |       | test4

                          ↓ この B 列が空なら、を階層が増える毎に追加する
=ArrayFormula(iferror(if((B:B="")*(row(C3:C)-countblank(C3:C)<=MATCH(2,1/(C:C<>""),1)),lookup(row(B3:B),row(B3:B)/if(C3:C<>"",TRUE,FALSE),B3:B),),""))

Query

https://support.google.com/docs/answer/3093343

Google Visualization API のクエリ言語を使用して、データ全体に対するクエリを実行します。

データを集約したりカウントしたりするのは Query を使うのが楽。

予約語との衝突

QUERY error for BY column

  • BYOR など SQL で予約語になっている列名を使う時は衝突に注意
  • Reserved Words を参照
# BY が予約後なのでバッククォートでかこってやる
=query(sheet!A2:BZ, "select A, AB, `BY`, BZ")

クエリ結果が空のときの制御

Google Sheets(スプレッドシート)のQUERY関数で元範囲がわかる状態で複数範囲を結合する方法

query({}) 内部でクエリ結果配列を union する際に、結果が空のものがあると ARRAY_LITERAL の配列リテラルで、1 つ以上の行の値が見つかりませんでした。 エラーになる。

iferror() で囲ってエラーケース (結果が空) のとき select で指定した数の空要素を含んだ配列リテラルをわたしてやる。

# 2 つの別シートの A 列には同一の ID があって
# それを 1 つのデータにまとめる的な簡易的な例
#
=query({
  iferror(query('別シート1'!A2:C, "select A, B, C where B != ''"),{"","",""});
  iferror(query('別シート2'!A2:C, "select A, B, C where B != ''"),{"","",""})
})

別シートの内容を 1 つにまとめる

# importrange を使って別 sheets の sheet を参照してる、自シートでもおk
# select 部分は省略可能、この数式では列 B, A, C で表示されるよう入れ替えてる
# where 句で空白行を無視してる

=query({
  query(importrange("https://...", "しーと1!a2:c"),"select Col2, Col1, Col3 where Col1 is not null");
  query(importrange("https://...", "しーと2!a2:c"), "select Col2, Col1, Col3 where Col1 is not null")
})

横持ちテーブルを正規化 (縦持ち) に変換

(Gスプレッドシート)横持ちの表を縦持ちに変換する例

いわゆるマルチカラムアトリビュート (tag1, tag2 みたいなカラム) を正規化するときの。

カスタム数式

address(row(), column())  # AB6 とかがとれる
// このカラムが hoge なら
=INDIRECT("G"&row())="完了"

// 一つ上とおんなじ
=(INDIRECT("A"&row()-1)=indirect("A"&row()))

// この列の ↑ の 2 行目が "土曜日" だったら
=indirect(address(2, column()))="土曜日"

// がんとチャートっぽいので使った
=and(datevalue(indirect((address(row(), 4))))<=datevalue(indirect(address(1, column()))), datevalue(indirect((address(row(), 5))))>=datevalue(indirect(address(1, column()))))

// 奇数偶数でうんたら
=MOD(ROW(),2)=1

// 範囲と範囲を比較して違ったら
=A1<>'HogeSheet'!A1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment