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

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

ただいまの
回答率

88.13%

GASにてスプレッドシートの特定の位置に書き込みをしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 205

score 1

前提・実現したいこと

GASを初めて使用しています。
予約システムのようなものを作成したく、部屋と時間を選択してもらいフォームで送信、その値をスプレッドシートに保存し、別のスプレッドシートにあらかじめ時間と場所を記載しておき、フォームから送信された該当場所を塗りつぶすという感じを想定しています。

列のみを検索する方法は発見できたのですが、列、行ともに該当場所を検索し、その該当場所に記載をする方法はありませんでしょうか?
今は、行のみ参照ができている状況です。
よろしくお願いいたします。

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

該当のソースコード

function booking() {
 const formSs = SpreadsheetApp.getActiveSpreadsheet();
  const formSheet = formSs.getSheetByName("answer");
  let today = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd')


  //最終行取得
  let lastRow = formSheet.getLastRow();
  //氏名
  let sName = formSheet.getRange(lastRow, 3).getValue();
  //日付
  let day = formSheet.getRange(lastRow, 4).getValue().toString();
  //部屋番号
  let rNumber = formSheet.getRange(lastRow, 6).getValue();
  //開始時間
  let time = formSheet.getRange(lastRow, 5).getValue().toString();

  //予約表取得
  const bookSs = SpreadsheetApp.openById("予約表のスプレッドシートID");
  const bookSheet = bookSs.getSheetByName(today);
    var col = "A"; //部屋番号の場所
    var bookRow = "1"; //時間の場所
    var rows = get_rows(rNumber, col, bookSheet);
    rows.forEach(function (row, i) {
        bookSheet.getRange(row, 2).setValue("Here");
    });
}
//部屋の確認
function get_rows(rNumber, col, bookSheet) {
    var array = get_array(bookSheet, col);
    var rows = [];
    array.forEach(function (str, i) {
        if (rNumber == str) {
            rows.push(i + 1);
        }
    });
    return rows;
}
function get_array(bookSheet, col) {
    var last_row = bookSheet.getLastRow();
    var range = bookSheet.getRange(col + "1:" + col + last_row);
    var values = range.getValues();
    var array = [];
    for (var i = 0; i < values.length; i++) {
        array.push(values[i][0]);
    }
    return array;
}

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

英語ですが公式ヘルプはこちら。
https://developers.google.com/apps-script/reference/spreadsheet/sheet#getrangerow-column-numrows-numcolumns

いろんな方法がありますが。

getRange(a1Notation) 

がまずは一番扱いやすいでしょう。

getRange("A1")

---質問早合点で修正---

見出し列と行の値をKEYにして、row,colの数値をvalueにしておく連想配列を
つくっておく方法はいかがでしょうか?
(※文字列となるようセル値は"'10:00"先頭シングルクォート)

  const values = sheet.getDataRange().getValues();
  var key2addr_row = {};
  var key2addr_col = {};
  for (var row = 0; row < values.length; row++) {
    key2addr_row[values[row][0].toString()] = row + 1;
  }
  for (var col = 0; col < values[0].length; col++) {
    key2addr_col[values[0][col]] = col + 1;
  }
  const targetCell = sheet.getRange(key2addr_row["103"], key2addr_col["10:00"]);
  console.log(targetCell.getValue());

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/04/08 23:48

    ありがとうございます!
    言葉足らずで申し訳ないのですが、例えば
    部屋/時間 9:00 10:00 11:00 ・・・
    101
    102
    103
    ・・・
    のような表を作成し、ユーザが101、9時を送信したらその場所を特定する方法を知りたいと思っています。
    もしおわかりでしたらお教えいただきたいです。

    よろしくお願いいたします。

    キャンセル

  • 2021/04/09 07:57

    失礼しました。早合点すぎましたね。
    追記しました。
    これもいろんな方法があると思いますが、一例として。

    キャンセル

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

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

関連した質問

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