みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

スプレッドシートでシートをまたいで計算したい

Googleスプレッドシートで日報を作っています。1シート1日とし、最初の1シート目にそれまでの合計(例えば18日だったら1日~18日までの合計)が計算されるようにしたいと考えています

合計(1シート目)現在の日までの合計表示
1日(2シート目)1日目の数値
2日(3シート目)2日目の数値と1日目と2日目の数値の合計
3日(4シート目)3日目の数値と1日目~3日目の数値の合計
4日(5シート目)4日目の数値と1日目~4日目の数値の合計
.
.

といった感じです。上の説明で4日目の「1日目~4日目の数値の合計」などの計算させるとき各シートの該当セルを一つづつ呼び出せば表示されますが、30日目の「1日目~30日目の合計」となるととてつもなく面倒になってしまいました。項目は固定で「売上・利益・交通費・人件費」などになります。

function sumSkicount(cell_no, start_name, end_name) {
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
var sum = 0;
var add_flag = false;

for(var i = 0; i < sheets.length;i++) {
if(sheets[i].getName() == start_name){add_flag = true;}
if(add_flag){
if(isNaN(sheets[i].getRange(cell_no).getValue())){
value = 0;
}else{
value = parseInt(sheets[i].getRange(cell_no).getValue());

}
sum = parseInt(sum) + value;

}
if(sheets[i].getName() == end_name){break;}
}
return sum;
}

のコードを書き「1日目~4日目の数値の合計」などを計算させたいセルにsumSkicount(cell_no, start_name, end_name) を入れ計算させましたが、うまく動きませんでした。

cell_no→計算させたいセル
start_name→始まりのシート
end_name→終わりのシート

どなたかご指摘アドバイスいただけると非常にありがたいです。よろしくお願いいたします。

投稿日時 - 2019-03-28 02:12:16

QNo.9601176

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

以下のようにしておくと
=kusiSum("A1","始まりのシート")
で終わりのシートを省略できます。
どちらにしても自動再計算はしてくれないみたいですが…。

function kusiSum(cell_no, start_name) {
var objS=SpreadsheetApp.getActiveSpreadsheet();
var sheets = objS.getSheets();
var sum = 0;
var add_flag = false;
var My_sheet = objS.getActiveSheet().getName();

for(var i = 0; i < sheets.length;i++) {
if(sheets[i].getName() == start_name){add_flag = true;}
if(add_flag){
if(isNaN(sheets[i].getRange(cell_no).getValue())){
var value = parseInt(sheets[i].getRange(cell_no).getValue());
}else{
var value =sheets[i].getRange(cell_no).getValue();
}
sum = parseInt(sum) + value;
}
if(sheets[i].getName() == My_sheet){break;}
}
return sum;
}

投稿日時 - 2019-03-29 07:49:16

ANo.2

元の串刺しコードでしたら以下のように変更してみてはいかがでしょう。
IsNaNは数値だとFalseを返します。
if(isNaN(sheets[i].getRange(cell_no).getValue())){
var value = parseInt(sheets[i].getRange(cell_no).getValue());
}else{
var value = sheets[i].getRange(cell_no).getValue();
}

もしくは

if(isFinite(sheets[i].getRange(cell_no).getValue())){
var value = sheets[i].getRange(cell_no).getValue();
}else{
var value = parseInt(sheets[i].getRange(cell_no).getValue());
}

投稿日時 - 2019-03-29 00:09:22

ANo.1

各シートのA1に当日の数値、B1に当日+前日までの合計があるとして

合計(1シート目)現在の日までの合計表示 最終シートのB1
1日(2シート目)A1=1日目の数値 B1=1日目の数値
2日(3シート目)A1=2日目の数値 B1=1日のB1+A1
3日(4シート目)A1=3日目の数値 B1=2日のB1+A1
4日(5シート目)A1=4日目の数値 B1=3日のB1+A1

でいいのではないでしょうか。

シートが連続しているのでしたら

function GET_SHEET_NAME()
{
var objSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var sheet_no =objSheet.getIndex()-2;
return SpreadsheetApp.getActive().getSheets()[sheet_no].getSheetName();
}

B1にそれぞれ
=indirect(GET_SHEET_NAME() & "!B1")+A1

でいけそうな気がしますが、どうでしょう。

投稿日時 - 2019-03-28 21:22:40

あなたにオススメの質問