質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

5844閲覧

引数ではなくて、セルの数式(A1形式)で取得したい

ymk

総合スコア17

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2018/12/21 03:00

編集2018/12/21 04:26

=test("A1:A5")で実行したときにA1:A5を返す※例A1:A5

function test (range){
return range.getFormula();

以下のエラーメッセージが発生しました。

Cannot find function getFormula in object 30.(行 82)が発生しました。

###ほかに良い方法があれば教えていただけると助かります。

###一致する背景色のセルの合計
function SumColor(m){
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("B1:B5");
var getcolors = range.getBackgrounds();
var values = range.getValues();
var lastRow = sheet.getLastRow();
var sumfirst = 0;
var sum = parseInt(sumfirst);
for(var n = 0; n <= lastRow;n++){
var value = parseInt(values[n]);
var getcolor = getcolors[n];
if(m == getcolor){
sum = sum + value
}
}
return sum;
}
//m
function getColor(){
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange("D6");
var xcolor = range.getBackground();
return xcolor;
}

カスタム関数で、
=SumColor(getColor())

###以下のように使いたい
=SumColor(A1:A5,getColor(D6))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macaron_xxx

2018/12/21 03:47

ちょっと言っている意味がわからないのですが、A1:A5で返すというのは、文字列ではないのですか??何を返したいのかがまったく理解できません。
papinianus

2018/12/21 03:51

これって、どう使うのですか?
ymk

2018/12/21 03:52

A1:A5は、例で値を選択するので変わります!
papinianus

2018/12/21 03:53

ですので、それをどのように利用するのでしょうか?
ymk

2018/12/21 03:55

セルの背景色を取得して、その色と同じセルの合計を出すときに使う予定です。
ymk

2018/12/21 03:57 編集

背景色や合計を出すセルが変わっても機能するようにセルを決めて記述したくないのです!
macaron_xxx

2018/12/21 03:59

Rangeオブジェクトを返すということでいいのかしら。。
ymk

2018/12/21 04:01

セルの中身を取得するのはなくて、選択した範囲のA1:A5みたいなのが欲しいんです。
macaron_xxx

2018/12/21 04:06

あ、なんとなく理解しました。test関数って、カスタム関数としてセルに"=test(A1:A5)"みたいな形で入力して使おうとしているわけですね。その上で、そのRangeオブジェクトを取得したい、と。
papinianus

2018/12/21 04:16

ymk様の仰る用途で、範囲が欲しいというのが分からないので、具体的に「もしできたらこういう関数をセルに書きたい」(今はエラーでもいいので)というのを示していただくことはできませんか?
ymk

2018/12/21 04:16

そうです!そうです!! カスタム関数!!!
ymk

2018/12/21 04:20

載せるので、少々お待ちください
macaron_xxx

2018/12/21 04:34

=SumColor(A1:A5,getColor(D6)) この形式では無理なので =SumColor("A1:A5",getColor("D6")) この形式になります。
papinianus

2018/12/21 04:46

最初からこれ書いてたら、マイナス評価は回避できたと思いますよ。
ymk

2018/12/21 04:55

初投稿でした笑
guest

回答2

0

ベストアンサー

=test(A1:A5)のようにセルを指定する場合には、できません。

Arguments
Like a built-in function, a custom function can take arguments as input values

https://developers.google.com/apps-script/guides/sheets/functions

とあるように、引数は入力値として受け取ります。そのRangeを受け取ることはできません。

セル選択ではなく文字列として
=test("A1:A5")
と入力した場合には、下記のようにそのRangeを返すことができます。

JS

1function test(range){ 2 return SpreadsheetApp.getActiveSheet().getRange(range); 3}

実践的にいえば
セルの入力:=yellowSum("A1:A5")

JS

1function yellowSum(range) { 2 var targetRange = SpreadsheetApp.getActiveSheet().getRange(range) 3 var values = targetRange.getValues(); 4 var bgColors = targetRange.getBackgrounds(); 5 6 var summary = 0; 7 bgColors.forEach(function(row, iRow) { 8 row.forEach(function(bgColor, iCol) { 9 if(bgColor === "#ffff00") { 10 summary += values[iRow][iCol]; 11 } 12 }); 13 }); 14 return summary; 15}

たぶん色々考慮漏れてる気はしますが…。

追記

js

1function SumColor(strRange, color){ 2 var sheet = SpreadsheetApp.getActiveSheet(); 3 var range = sheet.getRange(strRange); 4 var getcolors = range.getBackgrounds(); 5 var values = range.getValues(); 6 var lastRow = sheet.getLastRow(); 7 var sumfirst = 0; 8 var sum = parseInt(sumfirst); 9 for(var n = 0; n <= lastRow;n++){ 10 var value = parseInt(values[n]); 11 var getcolor = getcolors[n]; 12 if(color == getcolor){ 13 sum = sum + value 14 } 15 } 16 return sum; 17} 18 19//m 20function getColor(strRange){ 21 var sheet = SpreadsheetApp.getActiveSheet(); 22 var range = sheet.getRange(strRange); 23 var xcolor = range.getBackground(); 24 return xcolor; 25}

カスタム関数で、
=SumColor("A1:A5",getColor("D6"))

こうですね。

投稿2018/12/21 03:57

編集2018/12/21 04:40
macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ymk

2018/12/21 05:12

はい、"を自分でつけます… ありがとうございました。
guest

0

javascript

1function test(rangetext){ 2 return SpreadsheetApp.getActiveSheet().getRange(rangetext).getFormula(); 3}

追記

=SUM(test("H8:I8")という風に使いたいということですかね?
無理じゃないですか?(macaron_xxx様の案の方式も試してますが計算してくれませんでした)
単に=SUM($H$8:$I$8)ではダメなんでしょうか?

--
質問

セルの背景色を取得して、その色と同じセルの合計を出すときに使う予定です。
背景色や合計を出すセルが変わっても機能するようにセルを決めて記述したくないのです!

のところ、具体的に利用時の関数の例を示してもらえませんか?
それって変動するのは背景色だけなので、質問のようなことをする必要がないように思うのですが?

投稿2018/12/21 03:50

編集2018/12/21 04:15
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/12/21 03:52

やりたいことが判明したら、書き直しになると思いますが、今のコードを動くように直したものです。
macaron_xxx

2018/12/21 04:16

SUM関数は引数に2次元配列をとりますので、=SUM(test("H8:I8"))のような風に使う場合には単純に function test(range){ return SpreadsheetApp.getActiveSheet().getRange(range).getValues(); } でいけるはず。
papinianus

2018/12/21 04:20

そうなんですね(シート関数ヘルプをみつつ回答しているのですが、ヘルプからはその仕様は分かりませんでした)。勉強になります。 まあ、そもそもSUMだったら文字にする意味がないので、いずれにしても読解が違うのだと思います。 やりたいこと(sumifとかではいかと思うのですが)に対して、範囲表現オブジェクトが欲しいというのがまだ腑に落ちないです。
macaron_xxx

2018/12/21 04:31

選択された範囲の中で背景色が黄色のセルの合計数を取得したい とかそういうことだと思います。 用意された関数では、背景色でSUMIFとかできないですし。 ただ、セル一つ一つみていくので、めちゃくちゃ遅くなりそうな…。
papinianus

2018/12/21 04:37

正解書かれちゃうと思うのでこちらで。 sumif色取れないんですね。 そもそもsumif相当のやつが2引数とれば済む話しやないかなーと思いました。
papinianus

2018/12/21 04:43

覚え書きとして。 そもそもフィルターすら背景色が効かないのね。Excelを置きかえる日をまってるのに。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問