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

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

ただいまの
回答率

88.22%

シートで作成されたカレンダーで指定曜日のイベントを取得したいです。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 314

koroaisu

score 8

前提・実現したいこと

Googleシートで作成されたカレンダーで指定の曜日のイベント及び日付などのデータを取得し、別シートにリストアップするコードを作成しました。

■希望の機能:指定した曜日にあるすべてのイベント名及び当日の日付を取得して、「test」シートの1列目に日付、2列目からすべてのイベント名を記入。
イメージ説明

発生している問題・エラーメッセージ

イベント名の取得まではうまくいきましたが、イベント名を記入する際に、最初のイベントのみ記入され、すべてのイベント名は記入されません。

カレンダー詳細

イメージ説明

該当のソースコード

var SS = SpreadsheetApp.openById("リンク先");//スプレッドシートを取得
var TargetSheet = SS.getSheetByName("event");//カレンダー
var ReturnSheet = SS.getSheetByName("test");//データ記入シート
var dateRow=2; //日付の列
var yobiRow=3; //曜日の列
var TagetSheet_lastCol = TargetSheet.getLastColumn();
var TagetSheet_lastRow = TargetSheet.getLastRow();
var ReturnSheet_lastCol = TargetSheet.getLastColumn();
var ReturnSheet_lastRow = TargetSheet.getLastRow();

function getEventValue() {
  var datelist=[]; //日付を格納する配列
  var eventlist=[]; //イベント名を格納する配列

  for(var i=0;i<TagetSheet_lastCol;i++){
    var yobiValue=TargetSheet.getRange(yobiRow,i+1).getValue();   
    if(yobiValue=="木"){  //木曜日を指定
      var dateValue=TargetSheet.getRange(dateRow,i+1).getValue();
      var EventDataValue=TargetSheet.getRange(6,i+1,TagetSheet_lastRow,1).getValues();
      var SaveDataList=[];
      for(var y=0;y<EventDataValue.length;y++){
        if(EventDataValue[y]!=""){  //イベント種類によっては列が空白になるので、空白のモノをスキップ
          SaveDataList.push(EventDataValue[y]); //SaveDataListに一旦、当日のイベント名をすべて格納
        }

      }
      eventlist.push(SaveDataList); //SaveDataListがリセットされるため、イベント名をこちらに渡す
      datelist.push(dateValue)
    }
  }
  for(var x=0;x<eventlist.length;x++){
    ReturnSheet.getRange(1,x+1).setValue(datelist[x]);
    ReturnSheet.getRange(2,x+1).setValue(eventlist[x]);
  }
  }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2019/10/26 22:57

    行列の表現が、回答者が理解するものと合致しているか不安しかない(コードでは行方向にに変動する要素がない)ので、本当におこり得るレベルのサンプルデータを示してください。これは列方向に正規化されているかも不安だからです。説明文が足りなさすぎます。エラーがあって直すべきコードは状況の理解の参考になりません。

    キャンセル

  • koroaisu

    2019/10/28 11:35

    この度は説明に不足があり、誤解を招いて、無駄な時間を掛せてしまい、申し訳ございません。
    説明の方にカレンダーの参考画像および希望機能の画像を追加致しました。
    また、忙しい中、情報不足を指摘くださって、誠にありがとうございます。

    キャンセル

回答 1

0

コード未検証。おそらくこういうことだと思う

function q219502() {
    const spreadSheet = SpreadsheetApp.getActive();
    const eventSheet = spreadSheet.getSheetByName('event');
    const startOfDataRow = 2; //10/24 が C2 と仮定
    const startOfDataCol = 3; //10/24 が C2 と仮定
    const endRow = eventSheet.getLastRow();
    const endCol = eventSheet.getLastColumn();
    // 結合セルからデータをひろってくる
    const allData = q180220_getMargedRangeValues(sheet, startOfDataRow, startOfDataCol, endRow, endCol);
    // 曜日でフィルタ
    const theDay = "木";
    const indexOfTheDays = allData[1].reduce(function(a, c ,i) { return c === theDay ? a.concat([i]) : a;},[]);
    // // 曜日行を消す
    allData.splice(1,1);
    // // 曜日を行方向にして、空白をスキップしたデータに作り直す(求める姿とは行と列が逆転している。
    const summed = indexOfTheDays.map(function(p){ return allData.reduce(function(a,c,i){ return i === p && c !== "" ? a.concat([c]) : a ;},[]);});
    const maxSize = summed.reduce(function(a,c){ return c.length > a ? c : a ;}, 0);
    // // 行の長さを揃える
    const fixed = summed.map(function(r){ return fillingArray(r, maxSize, "");} );
    // 行列転置
    const transposed = fixed[0].map(function(_, c) { return fixed.map(function(r) { return r[c];});});
    spreadSheet.getSheetByName('test').getRange(1,1,transposed.length, transposed[0].length).setValues(transposed);
}

// getRangeと同じように 1-indexed で指定する
function q180220_getMargedRangeValues(sheet, startRow, startCol, endRow, endCol) {
    const targetRange = sheet.getRange(startRow, startCol, endRow, endCol);
    var ret = targetRange.getValues();
    targetRange.getMergedRanges().forEach(function(rng) {
        var startR = rng.getRow();
        var startC = rng.getColumn();
        var rngVal = rng.getValue();
        var rngA1 = rng.getA1Notation();
        var rowBoundary = startR + rng.getNumRows();
        var colBoundary = startC + rng.getNumColumns();
        for(var ri = startR; ri < rowBoundary ; ri++) {
            var ri_a = ri - startRow;
            if(ri_a < 0) { continue; }
            if(ret.length <= ri_a) { break; }
            for(var ci = startC; colBoundary; ci++) {
                var ci_a = ci - startCol;
                if(ci_a < 0) { continue; }
                if(ret[ri_a].length <= ci_a) { break; }
                ret[ri_a][ci_a] = rngVal;
            }
        }
    });
    return ret;
}

function fillingArray(array, len, fill) {
    var pseudo = [];
    for(var i = 0; i < len; i++) {
        pseudo.push(fill);
    }
    return array.concat(pseudo).slice(0, len);
}

将来参考に訪れたかたへ

あなたのデータを見直してください。

列方向に組まれたデータはハンドリングが大変です。
データベースもGoogle Sheet(を加工するGoogle App Script)も行方向に1データです。

表示に最適化されすぎたデータはプログラム処理に向きません。
データモデルと表示は分離して、結合列や背景色でデータを表現しないようにしましょう。プレゼンするときにだけ、整形しましょう。またプレゼンのために新たに作らなくても、google sheetやexcelでは他のシートを参照する機能があるので、データシートと連動する表示シートを作るのはさほど難しくないはずです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/30 16:09

    このデータ構造は加工がつらい。これは業務委託するレベル

    キャンセル

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

  • ただいまの回答率 88.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る