GAS書くとき毎回使うやつ

GAS

ChatGPTが教えてくれるからこのページいらなくなった気がしてきた・・・

スポンサーリンク

シート取得の関数化(APIたたく回数を少なくする)

function getHogeSheet() {
  if (getHogeSheet.useid_sheet) { return getHogeSheet.useid_sheet; }
  getHogeSheet.useid_sheet = SpreadsheetApp.openById(SHEET_KEY).getSheetByName('hoge');
  return getHogeSheet.useid_sheet;
}

const hoge_sheet = getHogeSheet();

スプレッドシートの最終行

const last_row = hoge_sheet.getLastRow();

スプレッドシートの最終列

const last_col = hoge_sheet.getLastColumn();

スプレッドシートの表を二次元配列で取得

const table() = hogesheet.getRange(1,1,last_row,last_col).getValues();

単純な表ならこうでもいい

const table() = hogesheet.getDataRange().getValues();

スプレッドシートの範囲コピペ

copy_range.copyTo(dest_range,{contentsOnly:true});

1セルずつ値を見て特定の値の時なんかする処理

let cnt = 0;
for let r = 0; r < table.length; r++{ //table[0]はヘッダーを想定
  for let c = 0 < table[r].length; c++{
    if(table[r][c] == "hoge"){
      cnt =  cnt + 1
    }
  }
}

※データの量にもよるが、上記の処理をGASのAPIであるgetValue();で実装すると終わるまで一生(6分以上)かかる。

スプレッドシート上のヘッダーや1行目のキーで表の検索をしたい時なんかは下記の1行で1次元配列で取得可能

const column_array = hoge_sheet.getRange('A:A').getValues().flat().filter(function(x){return !(x === null || x === undefined || x === "");});
const row_array = hoge_sheet.getRange('1:1').getValues().flat().filter(function(x){return !(x === null || x === undefined || x === "");});

※filterで空のセルはツメてるので途中に空白がある場合は別手段が必要

そしてこれで配列の中の何番目にターゲットがあるか=スプレッドシートの何列目or何行目かを特定する

function searchIndex(array, target){
  let result = 0;
  let cnt = 0;
  for(let r = 0; r < array.length; r++ ){
    cnt = cnt + 1
    if(array[r] == target){
      result = cnt;
    }
  }
  return result;
}

メール通知

Googleフォームとスプレッドシートで連携して回答があったときとかスプレッドシートが編集されたときに指定のメールアドレスにメール通知したい場合なんかに
FROMがnoreplyにできます。
大事なのは、トリガー設定でスプレッドシート主導のフォーム送信時または編集時にこの関数を実行する設定をしておくことです。

function noticeMail() {
  const target = "havetonotice@taibonn.com";
  const title = "フォームに投稿がありました。"
  GmailApp.sendEmail(target, title, 'フォームに投稿がありました。\nご確認ください。\nhttps://docs.google.com/spreadsheets/d/*****/edit?usp=sharing', {noReply: true});
}

実行してる人のメールアドレス取得

const mail_address = Session.getActiveUser().getEmail();

日付関係

前月1日~末日の丸1カ月を取得したいときに

  const date = new Date();
  const this_year = date.getFullYear();
  const now_month = date.getMonth(); //1月=0,12月=11
  const last_month = now_month -1;
  //YYYY-MM-DDThh:mm:ssTZD 形式なら

  //date_footer = "T24:00:00+09:00"

  const start = new Date(this_year, last_month-1, 1); //初日
  const end = new Date(this_year, last_month, 0);//末日
  const start_date = Utilities.formatDate(start, 'JST', 'yyyy-MM-dd'); 
  const end_date = Utilities.formatDate(end, 'JST', 'yyyy-MM-dd'); 

今日の日付をそれぞれの形で取得する

function getTodayWithFormat(){
  const day_of_week_arry = ["日","月","火","水","木","金","土"];
  const date = new Date();
  const today = Utilities.formatDate(date, "JST", "yyyy年MM月dd日");
  const day_of_week = day_of_week_arry[date.getDay()];
  const obj = {
    "today": today,
    "day_of_week": day_of_week,
    "year": Utilities.formatDate(date, "JST", "yyyy"),
    "month": Utilities.formatDate(date, "JST", "MM"),
    "day": Utilities.formatDate(date, "JST", "dd")
  }
  console.log(obj.today + "  " + obj.day_of_week + "  " + obj.year + "  " + obj.month + "  " + obj.day);
  return obj;
}

随時追加していく気持ち

スポンサーリンク

コメント

タイトルとURLをコピーしました