Apps Script公式リファレンス: Apps Script Reference |障害・課題追跡: IssueTracker |Google Workspace: Status Dashboard - Summary

2019年6月30日日曜日

指定した期間の日付と曜日をスプレッドシートの1,2行目に書き出したい


指定した期間の日付をスプレッドシートの一行目に書き出したい
では日付だけを出力しましtが、

ここでは曜日も SUN, MON, TUE, WED, THU, FRI, SAT などで出力します。




コード.gs
/************************************
startからendの日付と曜日をss_urlの先頭シートに入力する
************************************/
function run() {
  var start = "2019/01/01";// この日から
  var end = "2019/12/31";// この日までの日付を
  var ss_url = 'https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=0';// このスプレッドシートに書き出す
  
  var ss = SpreadsheetApp.openByUrl(ss_url);
  var sheet = ss.getSheets()[0];

  set_dates(sheet, start, end);// カレンダーを入力する
  set_line_heading(sheet);// 行見出しを入力する
  set_alignment(sheet);// セル内を中央寄せにする
}

/************************************
日付と曜日を入力する
************************************/
function set_dates(sheet, start, end) {
  var dates = get_dates(start, end);
  var start_row = 1;
  var start_col = 2;
  set_values(sheet, dates, start_row, start_col);
}

/************************************
startからendの日付と曜日を取得して返す
************************************/
function get_dates(start, end){
  var start_date = new Date(start);
  var end_date = new Date(end);
  var days = (end_date - start_date) / 1000 / 60 / 60 / 24;// 日数の差を出す
  var dates = get_each_days(start_date, days);
  return dates;
}

/************************************
日付と曜日を取得して返す
************************************/
function get_each_days(start_date, days) {
  var arrays = [];
  var day_nums = [];
  var dates = [];
  for(var i = 0; i < (days + 1); i++) {// daysのままだと一日足りない
    var year_now = start_date.getFullYear();
    var month_now = start_date.getMonth();
    var date_now = start_date.getDate();
    var new_date = new Date(year_now, month_now, date_now + i);
    var day_num = new_date.getDay();
    day_num = get_days(day_num);
    var date = Utilities.formatDate(new_date, 'Asia/Tokyo', 'yyyy/MM/dd');
    dates.push(date);
    day_nums.push(day_num);
  }
  arrays.push(dates,day_nums);
  return arrays;
}

/************************************
行見出しを入力する
************************************/
function set_line_heading(sheet) {
  var line_heading = [['DATE'], ['DAY']];
  var start_col = 1;
  var start_row = 1;
  set_values(sheet, line_heading, start_row, start_col);
}

/************************************
曜日を入れる
************************************/
function get_days(day_num) {
  var SEVEN_DAYS = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'];
  var days = SEVEN_DAYS[day_num];
  return days;
}

/************************************
水平方向の配置を決める
************************************/
function set_alignment(sheet) {
  var range = sheet.getRange('1:2');
  range.setHorizontalAlignment('center');
}

/************************************
シートにカレンダーを入力する
************************************/
function set_values(sheet, array, start_row, start_col){
  var last_row = sheet.getLastRow();
  var num_rows = array.length;
  var num_cols = array[0].length;
  var range = sheet.getRange(start_row, start_col, num_rows, num_cols);
  range.setValues(array); 
}



関連記事

指定した期間の日付をスプレッドシートの一行目に書き出したい

選択範囲のセルの水平方向の配置をスクリプトで指定したい


Googleスプレッドシートで

セル内の文字が右寄せになっているものを


中央に寄せたい



メニューからやるとこの操作でできることを


スクリプトでやってみる


コード.gs
function myFunction() {
  var sheet = SpreadsheetApp.getActive();
  var range = sheet.getRange('1:2');
  range.setHorizontalAlignment('center');
};
意訳
この機能がやること
開いているシートを取得して
1行目から2行目を選択して
水平方向の配置をcenterにする




補足

マクロの記録でやると以下のようなスクリプトが作られました


コード.gs
function myFunction1() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('1:2').activate();
  spreadsheet.getActiveRangeList().setHorizontalAlignment('center');
};



2019年6月26日水曜日

配列内で重複する値の発生数を取得してオブジェクトを配列に入れて返す3


["ス", "モ", "モ", "も", "モ", "モ", "も", "モ", "モ", "の", "う", "ち"]

という配列から

重複件数を取得して以下のようなオブジェクトを作りたい

{
  ち=1.0,
  も=2.0,
  モ=6.0,
  う=1.0,
  ス=1.0,
  の=1.0
}



コード.gs
function get_result(){
  var array = ["ス", "モ", "モ", "も", "モ", "モ", "も", "モ", "モ", "の", "う", "ち"];
  var result = get_match_count(array);
  Logger.log(result);
}

function get_match_count(array){
  var sorted = array.sort();
  var count;
  var unique_i;
  var obj = {}
  for(var i = 0; i < sorted.length; i++){
    var value = sorted[i];
    if(value === sorted[i-1]){
      count++;
      obj[value] = count;
    }else{
      count = 1;
      obj[value] = count;
    }
  }
  return obj;
}


関連記事

配列内で重複する値の発生数を取得してオブジェクトを配列に入れて返す2


配列内で重複する値の発生数を取得してオブジェクトを配列に入れて返す2


配列内で重複する値の発生数を取得してオブジェクトを配列に入れて返す
では

["ス", "モ", "モ", "も", "モ", "モ", "も", "モ", "モ", "の", "う", "ち"]

という配列から

重複件数を取得して以下のようなオブジェクトを作りたい

[
  {う=1.0},
  {ち=1.0},
  {の=1.0},
  {も=2.0},
  {ス=1.0},
  {モ=6.0}
]





コード.gs
function get_result(){
  var array = ["ス", "モ", "モ", "も", "モ", "モ", "も", "モ", "モ", "の", "う", "ち"];
  var result = get_match_count(array);
  var desc = sort_obj(result)
  Logger.log(desc);
}

function get_match_count(array){
  var sorted = array.sort();
  var arrays = [];
  var count;
  var unique_i;
  for(var i = 0; i < sorted.length; i++){
    var obj = {}
    var value = sorted[i];
    if(value === sorted[i-1]){
      count++;
      arrays[unique_i][value] = count;
    }else{
      count = 1;
      obj[value] = count;
      unique_i = arrays.length;
      arrays.push(obj);
    }
  }
  return arrays;
}

function sort_obj(arrays){
  var desc = arrays.sort(sorting);
  return desc;
}

function sorting(a, b){
  return b["count"] - a["count"];
}


関連記事

配列内で重複する値の発生数を取得してオブジェクトを配列に入れて返す


TextFinderでシートの列内の文字列を検索してみる


TextFinderでシート内の文字列を検索してみる
ではシート内で検索しましたが、
列内で検索したくて書いたコードです。



コード.gs
function findAllRowsAtCol(){
  var rows = [];
  var targetCol = 1;
  var ss_url = 'SPREADSHEET_URL';
  var ss = SpreadsheetApp.openByUrl(ss_url);
  var sheet = ss.getSheets()[0];
  var textFinder = sheet.createTextFinder('探したい文字列');
  var ranges = textFinder.findAll();
  for (var i = 0; i < ranges.length; i++ ) {
    var row = ranges[i].getRow();
    var col = ranges[i].getColumn();
    if(col === targetCol) {
      rows.push(ranges[i].getRow());
    }
  }
  Logger.log([rows.length, rows]);
}


補足

範囲を指定して
range.createTextFinder('探したい文字列')
はできなかったので
targetColで列を指定する方法を書きました。


参考

Class TextFinder
https://developers.google.com/apps-script/reference/spreadsheet/text-finder#findAll()

TextFinderでシート内の文字列を検索してみる


列内で特定の値に一致する行番号を取得する
では特定の列で検索しましたが、
ここではシート内で検索するTextFinderを試してみます。



'SPREADSHEET_URL'
'探したい文字列'
を設定して findAllRows()を実行すると
探したい文字列を含む行番号が配列でログに出ます。


コード.gs
function findAllRows(){
  var rows = [];
  var ss_url = 'SPREADSHEET_URL';
  var ss = SpreadsheetApp.openByUrl(ss_url);
  var sheet = ss.getSheets()[0];

  var textFinder = sheet.createTextFinder('探したい文字列');
  var ranges = textFinder.findAll();
  for ( var i = 0; i < ranges.length; i++ ) {
      rows.push(ranges[i].getRow()) ;
  }
  Logger.log(rows);
}



参考

Class TextFinder
https://developers.google.com/apps-script/reference/spreadsheet/text-finder

AWSアカウントを作成したい


アカウント作成に必要な情報
  • Email
  • 住所
  • 電話番号
  • クレジットカード登録
(無料利用枠の上限を超えない限り課金されない)



https://aws.amazon.com/lambda/
を開きます

「無料サインアップ」or「AWSアカウントを今すぐ無料で作成」をクリックします


自分のEメールアドレス
ログイン時のパスワード
アカウント名
を設定して「続行」をクリックします


アカウントの種類を「パーソナル」にして
すべての項目を入力します
(全角は入力できないため、半角英数字で入力します)
チェックボックスにチェックを入れて
「アカウントを作成して続行」をクリックします


支払い情報を入力します


本人確認を入力して「SMSを送信する」をクリックします


設定した電話番号に認証コードが送られて来ます
入力して「コードの検証」をクリックします


「続行」をクリックします


「無料」をクリックします


 これでアカウントの作成は完了です





JavaScriptで2次元配列から順番に要素を取り出して新しい2次元配列を作りたい


このような配列があって

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]


内側の配列の前から順に要素を取り出して
このような新しい配列を作りたい

 [[1, 4, 7], [2, 5, 8], [3, 6, 9]]


簡単にできるかと思ったら意外と時間がかかって、頭をひねったコードです。



コード.gs
function arraysPush() {
  var values = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
  var arrays = [];
  for(var h = 0; h < values[0].length; h++) {
    var array = [];
    arrays.push(array);
  }
  
  for(var i = 0; i < values.length; i++) {
    var target = values[i];
    for(var j = 0; j < target.length; j++) {
      arrays[j].push(target[j])
    }
  }
  Logger.log(arrays);
}



2019年6月25日火曜日

Googleドライブ内の特定のフォルダ内でファイルを探して並べ替えて取得したい


特定のフォルダ内のファイルとファイルIDをファイル名順に取得したくて書いたコードです。



このようなファイルを持つフォルダがあって

SAMPLEというファイル名を含むファイル名とIDを
このように昇順で取得したい
[
 {name=SAMPLEシート1, id=FILE_ID},
 {name=SAMPLEシート2, id= FILE_ID},
 {name=SAMPLEシート3, id= FILE_ID}
]



コード.gs
function getFilesBySearch() {
  var folder = DriveApp.getFolderById("FOLDER_ID");
  var files = folder.searchFiles('title contains ""');
  var objs = [];
  while (files.hasNext()) {
    var file = files.next();
    var name = file.getName();
    var id = file.getId();
    var obj = {};
    obj["name"] = name;
    obj["id"] = id;
    objs.push(obj);
  }
  var sorted = objs.sort(asc)
  Logger.log(sorted);
  
}

function asc(a, b){
  var targetA = a.name;
  var targetB = b.name;
  if(targetA > targetB){
    return 1;
  }else if(targetA < targetB ){
    return -1;
  }else{
   return 0;
  }
}



関連記事

Googleドライブ内の特定のフォルダ内でファイルを探したい(スクリプトで)
Googleドライブ内のファイルをファイル名で並べ替えて取得したい
配列内のオブジェクトをvalueでソートしたい

スプレッドシートのノート(メモ)を削除したい


スプレッドシートシートの2行目以降に入力されているノート(メモ)を一気に削除したくて書いたコードです。



コード.gs
function clearNotes() {
  var ss_url = masterSheetUrl;
  var ss = SpreadsheetApp.openByUrl(ss_url)
  var sheet = ss.getSheets()[0];
  var start_row = 2;// 範囲の先頭を2行目にする
  var start_col = 1;
  var last_row = sheet.getLastRow();
  var last_col = sheet.getLastColumn();
  var num_rows = (last_row - start_row) + 1;
  var num_cols = (last_col - start_col) + 1;
  var range = sheet.getRange(start_row, start_col, num_rows, num_cols);
  range.clearNote();
}


関連記事

スプレッドシートのセルにノートを入力する
スプレッドシートのノートを取得する


参考

clearNote()
https://developers.google.com/apps-script/reference/spreadsheet/range#clearNote()

2019年6月24日月曜日

指定した期間の日付をスプレッドシートの一行目に書き出したい


このように一行目に指定した期間の日付を入れたい


例として2019/01/01から2019/12/31までの日付を入れるコードを書きました。

start と end とss_url を各自設定して set_dates() を実行すると
設定した期間の日付が設定したシートのいち行目に書き出されます。



コード.gs
function set_dates() {
  var start = "2019/01/01";// この日から
  var end = "2019/12/31";// この日までの日付を
  var ss_url = 'https://docs.google.com/spreadsheets/d/スプレッドシートID/edit#gid=0';// このスプレッドシートに書き出す
  
  var dates = [get_dates(start, end)];
  var ss = SpreadsheetApp.openByUrl(ss_url);
  var sheet = ss.getSheets()[0];
  set_values(sheet, dates);
}

function get_dates(start, end){
  var start_date = new Date(start);
  var end_date = new Date(end);
  var days = (end_date - start_date) / 1000 / 60 / 60 / 24;// 日数の差を出す
  var dates = get_each_days(start_date, days);
  return dates;
}

function get_each_days(start_date, days) {
  var dates = [];
  for(var i = 0; i < (days + 1); i++) {// daysのままだと一日足りない
    var year_now = start_date.getFullYear();
    var month_now = start_date.getMonth();
    var date_now = start_date.getDate();
    var new_date = new Date(year_now, month_now, date_now + i);
    var day = new_date.getDay();
    var date = Utilities.formatDate(new_date, 'Asia/Tokyo', 'yyyy/MM/dd');
    dates.push(date);
  }
  return dates;
}

function set_values(sheet, array){
  var last_row = sheet.getLastRow();
  var start_row = last_row + 1;
  var start_col = 1;
  var num_rows = array.length;
  var num_cols = array[0].length;
  var range = sheet.getRange(start_row, start_col, num_rows, num_cols);
  range.setValues(array); 
}



関連記事

指定した期間の営業日を出す(平日・土・日・祝日をそれぞれ分ける)
setValuesを使う話

オブジェクトの中から条件に一致する要素を抜き出す(AND検索)


以下のようなオブジェクトのプロパティ名 ja 中で「う」と「お」の両方含む値を取得したい



コード.gs
var obj = [
  {"en": "Aries", "ja": "おひつじ座"},
  {"en": "Taurus", "ja": "おうし座"},
  {"en": "Gemini", "ja": "ふたご座"},
  {"en": "Cancer", "ja": "かに座"},
  {"en": "Leo", "ja": "しし座"},
  {"en": "Virgo", "ja": "おとめ座"},
  {"en": "Libra", "ja": "てんびん座"},
  {"en": "Scorpius", "ja": "さそり座"},
  {"en": "Sagittarius", "ja": "いて座"},
  {"en": "Capriconus", "ja": "やぎ座"},
  {"en": "Aquarius", "ja": "みずがめ座"},
  {"en": "Pisces", "ja": "うお座"}
]

var pattern;
function filter_obj() {
  var values = ['う', 'お'];
  pattern = getAndPattern(values);
  var filtered = obj.filter(judge);
  var result = get_result(filtered);
  Logger.log(result);
}

function judge(items) {
  var regexp = new RegExp(pattern);
  var judged = regexp.test(items["ja"]);
  return judged;
}

function get_result(filtered) {
  var result = [];
  for (var i = 0; i < filtered.length; i++) {
    result.push([filtered[i]["en"], filtered[i]["ja"]]);
  }
  return result;
}

function getAndPattern(values) {
  var pattern = '^';
  for(var i = 0; i < values.length; i++) {
    pattern += '(?=.*' + values[i] + ')';
  }
  return pattern;
}



実行結果

 [[Taurus, おうし座], [Pisces, うお座]]


関連記事

オブジェクトの中から条件に一致する要素を抜き出す(filter)(正規表現を使う)
正規表現でAND検索を試してみる2

正規表現でAND検索を試してみる2


正規表現でAND検索を試してみる1
でやったことをもっと効率的な

/^(?=.*文字列1)(?=.*文字列2)/

で試してみます


ABO に AとOが両方含まれるか

コード.gs
function getAndConditional() {
  var str = 'ABO';
  var regexp = /^(?=.*A)(?=.*O)/;
  var result = regexp.test(str);
  Logger.log(result);
}

実行結果は true


パターンを動的に作りたい

コード2.gs
function getAndConditional2() {
  var str = 'ABO';
  var values = ['A', 'O'];
  var pattern = '^';
  for(var i = 0; i < values.length; i++) {
    pattern += '(?=.*' + values[i] + ')';
  }
  Logger.log(pattern);
  var regexp = new RegExp(pattern);
  var result = regexp.test(str);
  Logger.log(result);
}


実行結果


参考

正規表現はこちらの記事を参考にさせていただきました
正規表現で論理積(AND)を実現する
https://qiita.com/n4o847/items/dbcd0b8af3781d221424


正規表現

正規表現パターンの記述

正規表現でAND検索を試してみる1


対象の文字列の中に指定した文字がすべて存在するか知りたい

対象の文字列がABOで


指定文字がAとOの場合:
  1. ABOの中にAが存在するかを見る
  2. 存在しなければfalseを返す
  3. 存在すればOが存在するか見る
  4. 存在しなければfalseを返す
  5. 存在すればtrueを返す

結果、5まで実行してABOの中にAとOは存在するのでtrueを返す


指定文字がACの場合:
  1. ABOの中にAが存在するかを見る
  2. 存在しなければfalseを返す
  3. 存在すればCが存在するか見る
  4. 存在しなければfalseを返す
  5. 存在すればtrueを返す

結果、4まで実行してABOの中にAは存在するが、Cは存在しないのでfalseを返す



コード.gs
function myFunction() {
  var str = 'ABO';
  var target = 'AO';
  var conjunction = getAndConditional(str, target);
  Logger.log(conjunction);
}

function getAndConditional(str, target) {
  var values = target.split('');
  for(var i = 0; i < values.length; i++) {
    var regexp = new RegExp(values[i]);
    if(regexp.test(str) === false) {
      return false;
    }
  }
  return true;
}

意訳
この機能がやること
対象の文字列
探したい文字列
対象の文字列の中に、探したい文字列がすべて含まれるか判定して
ログにtrue, falseで出力する


この機能がやること
targetの文字列を一つずつ分けて
文字数の数だけ繰り返す
/A/のパターンを作って
strの中に含まれなければ
falseを返す


最後までfalseが返らなければtrueを返す




ちょっと書き換えて、valuesを配列にして渡す
var values = ['A', 'O'];

コード2.gs
function myFunction() {
  var str = 'ABO';
  var values = ['A', 'O'];
  var conjunction = getAndConditional(str, values);
  Logger.log(conjunction);
}

function getAndConditional(str, values) {
  for(var i = 0; i < values.length; i++) {
    var regexp = new RegExp(values[i]);
    if(regexp.test(str) === false) {
      return false;
    }
  }
  return true;
}


補足

ABO の中に A があるかどうかは

function myFunction() {
  var str = 'ABO';
  var result = /A/.test(str);
  Logger.log(result);
}

上記のように書けるので
同じように B があるか、Oがあるかを繰り返し見ていく
ということをコード1, 2でやっています



関連記事

正規表現でAND検索を試してみる2

JavaScriptで配列内の要素が一つでも条件を満たすか判定したい(some)


someを使うと判定できる



参考にしたサイトの数値をちょっと書き換えてみる


コード.gs
function getSomeResult() {
  var values = [1, 2, 3, 4, 5];
  Logger.log(values.some(judge));
}

function judge(value) {
  return value < 6;
}

valuesの中に6より小さい値があるか判定する
結果は true



さらに変数を追加して書き換えてみる


コード.gs
var targetNum = 3;

function getEveryResult() {
  var values = [1, 2, 3, 4, 5];
  var result = values.every(judge);
  Logger.log(result);
}

function judge(value) {
  return value < targetNum;
}

意訳
基準の数値を決めて

この機能がやること
配列を用意して
すべてがjudgeの条件に一致するか判定して
結果をログに出す


この機能がやること
配列の要素をひとつずつ見てtargetNumより小さいければtrueを返す


valuesの中に3より小さい値があるか判定する
3より大きい数値もあるが、小さい値もあるので結果は true



参考

Array.prototype.some()

JavaScriptで配列内のすべての要素が条件を満たすか判定したい(every)


everyを使うと判定できる


参考にしたサイトの数値をちょっと書き換えてみる


コード.gs
function getEveryResult() {
  var values = [1, 2, 3, 4, 5];
  Logger.log(values.every(judge));
}

function judge(value) {
  return value < 6;
}

valuesはすべて6より小さいか判定する
結果は true



さらに変数を追加して書き換えてみる


コード.gs
var targetNum = 3;

function getEveryResult() {
  var values = [1, 2, 3, 4, 5];
  var result = values.every(judge);
  Logger.log(result);
}

function judge(value) {
  return value < targetNum;
}

意訳
基準の数値を決めて

この機能がやること
配列を用意して
すべてがjudgeの条件に一致するか判定して
結果をログに出す


この機能がやること
配列の要素をひとつずつ見てtargetNumより小さいければtrueを返す


valuesがすべて3より小さいか判定する
3より大きい数値もあるので結果は false



参考

Array.prototype.every()

2019年6月23日日曜日

datalistの値を選択したときに、選択したテキスト以外の値を返したい


デモ


星座名を選択したときに、その英語名をアラートに出してみる


仕組み

このようなオブジェクトを用意しておいて

var objs = [
    { 'id': 'Aries', 'value': 'おひつじ座' },
    { 'id': 'Taurus', 'value': 'おうし座' },
    { 'id': 'Gemini', 'value': 'ふたご座' },
    { 'id': 'Cancer', 'value': 'かに座' },
    { 'id': 'Leo', 'value': 'しし座' },
    { 'id': 'Virgo', 'value': 'おとめ座' },
    { 'id': 'Libra', 'value': 'てんびん座' },
    { 'id': 'Scorpius', 'value': 'さそり座' },
    { 'id': 'Sagittarius', 'value': 'いて座' },
    { 'id': 'Capriconus', 'value': 'やぎ座' },
    { 'id': 'Aquarius', 'value': 'みずがめ座' },
    { 'id': 'Pisces', 'value': 'うお座' }
  ]

テキストボックスで選択した値に一致するvalueのidを返す



コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile("index");
}
意訳
この機能がやること
指定したHTMLファイルを表示する




index.html
<!DOCTYPE html>
<html>
  <body>
    <div id='main_div'>
      <input list='data_list' id='data_list_input'>
    </div>
  </body>

<script>

getData();

/************************************
elem(id)
************************************/
function elem(id) {
  return document.getElementById(id);
}

/************************************
objs
************************************/
function returnObj() {
  var objs = [
    { 'id': 'Aries', 'value': 'おひつじ座' },
    { 'id': 'Taurus', 'value': 'おうし座' },
    { 'id': 'Gemini', 'value': 'ふたご座' },
    { 'id': 'Cancer', 'value': 'かに座' },
    { 'id': 'Leo', 'value': 'しし座' },
    { 'id': 'Virgo', 'value': 'おとめ座' },
    { 'id': 'Libra', 'value': 'てんびん座' },
    { 'id': 'Scorpius', 'value': 'さそり座' },
    { 'id': 'Sagittarius', 'value': 'いて座' },
    { 'id': 'Capriconus', 'value': 'やぎ座' },
    { 'id': 'Aquarius', 'value': 'みずがめ座' },
    { 'id': 'Pisces', 'value': 'うお座' }
  ]
  return objs;
}

elem('data_list_input').onchange = dataChanged;

/************************************
getData
************************************/
function getData() {
  var main = document.getElementById('main_div');
  var datalist = document.createElement('datalist');
  datalist.setAttribute('id', 'data_list');
  var objs = returnObj();
  for (var i = 0; i < objs.length; i++) {
    var id = objs[i]['id'];
    var value = objs[i]['value'];
    var option = document.createElement('option');
    option.setAttribute('id', id);
    option.setAttribute('value', value);
    datalist.appendChild(option);
  }
  main.appendChild(datalist);
}

/************************************
dataChanged
************************************/
var targetName;

function dataChanged() {
  var datalist = elem('data_list');
  var dataValue = elem('data_list_input').value;
  var id = elem('data_list_input').list.options[0].id;
  var objs = returnObj();
  targetName = dataValue;
  var filtered = objs.filter(judge);
  var dataId = getResult(filtered);
  alert(dataId);
}

function judge(items) {
  var regexp = new RegExp(targetName);
  var judged = regexp.test(items['value']);
  return judged;
}

function getResult(filtered) {
  var result = [];
  for (var i = 0; i < filtered.length; i++) {
    result.push(filtered[i]['id']);
  }
  return result;
}

</script>
</html>



補足

selectとoptionの場合は
選択したときにonclickでthis.idなどの値を返せますが、
datatistとoptionの場合は
onclickが使えなかったため、
テキストボックスの値を元にオブジェクトからデータを引っ張ってくる
という方法で実現しました。

複数のスプレッドシートの値とノートを1つのシートにまとめたい(シート1)


複数のスプレッドシートをひとつにまとめたい(シート1)
複数のスプレッドシートのノートをひとつにまとめたい(シート1)

上記2つで書いたコードをマージして値とノートを一箇所に集めるコード



コード.gs
var folderId = 'FOLDER_ID';// 複数のシートが入っているフォルダID
var spreadsheets = getFiles(folderId);
var masterSheetUrl = 'SPREADSHEET_URL';// まとめるスプレッドシートのID
var noteCol = 'E';// E列

/************************************
これを実行する
************************************/
function runGetAndSetValues() {
  var ssIds = getSsIds(spreadsheets);
  for(var i = 0; i < ssIds.length; i++) {
    var sheetValues = getSheetValues(ssIds[i]);
    var sheetNotes = getSheetNotes(ssIds[i]);
    var sheet = SpreadsheetApp.openByUrl(masterSheetUrl).getSheets()[0];
    setSheetValues(sheet, sheetValues);
    setSheetNotes(sheet, sheetNotes);
  }
}

/************************************
対象のスプレッドシートのIDを取得して返す
************************************/
function getSsIds(spreadsheets) {
  var ssIds = [];
  for(var i = 0; i < spreadsheets.length; i++) {
    ssIds.push(spreadsheets[i]['id']);
  }
  return ssIds;
}

/************************************
シートの値を取得して返す
************************************/
function getSheetValues(ssId) {
  var ss = SpreadsheetApp.openById(ssId);
  var sheet = ss.getSheets()[0];
  var lastRow = sheet.getLastRow();
  var lastCol = sheet.getLastColumn();
  var range = sheet.getRange(2, 1, lastRow, lastCol);// 一行目はヘッダなので2行目から取得する
  var values = range.getValues();
  return values;
}

/************************************
シートに値を一気に入力する
************************************/
function setSheetValues(sheet, array){
  var lastRow = sheet.getLastRow();
  var startRow = lastRow + 1;
  var startCol = 1;
  var numRows = array.length;
  var numCols = array[0].length;
  var range = sheet.getRange(startRow, startCol, numRows, numCols);
  range.setValues(array); 
}

/************************************
ノートを取得する
************************************/
function getSheetNotes(ssId) {
  var ss = SpreadsheetApp.openById(ssId);
  var sheet = ss.getSheets()[0];
  var startRow = 2;
  var lastRow = sheet.getLastRow();
  var notes = sheet.getRange(noteCol + startRow + ':' + noteCol + lastRow).getNotes();
  return notes;
}

/************************************
シートにノートを一気に入力する
************************************/
function setSheetNotes(sheet, array){
  var lastRow = getLastNoteRow(sheet, noteCol);
  var startRow = lastRow + 1;
  var numRows = lastRow + array.length;
  var range = sheet.getRange(noteCol + startRow + ':' + noteCol + numRows);
  range.setNotes(array);
}

/************************************
入力されているノートの最終行を取得して返す
************************************/
function getLastNoteRow(sheet, col) {
  var lastCols = sheet.getLastColumn();
  var notes = sheet.getRange(col + ":" + col).getNotes();
  for (var i = notes.length - 1; i >= 0; i--) {
    if (notes[i] != "") {
      break;
    }
  }
  var lastNoteRow = i + 1;
  return lastNoteRow;
}

/************************************
フォルダ内のファイルを取得して
昇順にして返す
************************************/
function getFiles(folderId) {
  var fileProps = [];
  var folder = DriveApp.getFolderById(folderId);
  var contents = folder.getFiles();
  while(contents.hasNext()) {
    var file = contents.next();
    var name = file.getName();
    var id = file.getId();
    var obj = {};
    obj["name"] = name;
    obj["id"] = id;
    fileProps.push(obj);
  }
  var sorted = objSort(fileProps);
  return fileProps;
}

/************************************
並べ替える
************************************/
function objSort(fileProps) {
  var ascending = fileProps.sort(asc);
  return ascending;
}

/************************************
nameで昇順に並べ替える
************************************/
function asc(a, b){
  var A = a.name;
  var B = b.name;
  if(A > B){
    return 1;
  }else if(A < B ){
    return -1;
  }else{
   return 0;
  }
}



関連記事

複数のスプレッドシートをひとつにまとめたい(シート1)
複数のスプレッドシートのノートをひとつにまとめたい(シート1)

複数のスプレッドシートのノートをひとつにまとめたい(シート1)


複数のスプレッドシートをひとつにまとめたい(シート1)
ではセルの値を対象にしました。

ここではセルのノートを対象にして、
指定した列に入力されているノートをひとつのシートにまとめてみます。



コード.gs
var folderId = 'FOLDER_ID';// 複数のシートが入っているフォルダID
var spreadsheets = getFiles(folderId);
var masterSheetUrl = 'SPREADSHEET_URL';// まとめるスプレッドシートのID
var noteCol = 'E';// ノートが入っている列

/************************************
これを実行する
************************************/
function runGetAndSetValues() {
  var ssIds = getSsIds(spreadsheets);
  for(var i = 0; i < ssIds.length; i++) {
    var sheetNotes = getSheetNotes(ssIds[i]);
    Logger.log(sheetNotes.length)
    var sheet = SpreadsheetApp.openByUrl(masterSheetUrl).getSheets()[0];
    setSheetNotes(sheet, sheetNotes);
  }
}

/************************************
ノートを取得する
************************************/
function getSheetNotes(ssId) {
  var ss = SpreadsheetApp.openById(ssId);
  var sheet = ss.getSheets()[0];
  var startRow = 2;
  var lastRow = sheet.getLastRow();
  var notes = sheet.getRange(noteCol + startRow + ':' + noteCol + lastRow).getNotes();
  return notes;
}

/************************************
対象のスプレッドシートのIDを取得して返す
************************************/
function getSsIds(spreadsheets) {
  var ssIds = [];
  for(var i = 0; i < spreadsheets.length; i++) {
    ssIds.push(spreadsheets[i]['id']);
  }
  return ssIds;
}

/************************************
シートにノートを一気に入力する
************************************/
function setSheetNotes(sheet, array){
  Logger.log(array.length)
  var lastRow = getLastNoteRow(sheet, noteCol);
  var startRow = lastRow + 1;
  var numRows = lastRow + array.length;
  Logger.log(numRows)
  var range = sheet.getRange(noteCol + startRow + ':' + noteCol + numRows);
  range.setNotes(array);
}

/************************************
入力されているノートの最終行を取得して返す
************************************/
function getLastNoteRow(sheet, col) {
  var lastCols = sheet.getLastColumn();
  var notes = sheet.getRange(col + ":" + col).getNotes();
  for (var i = notes.length - 1; i >= 0; i--) {
    if (notes[i] != "") {
      break;
    }
  }
  var lastNoteRow = i + 1;
  return lastNoteRow;
}
/************************************
フォルダ内のファイルを取得して
昇順にして返す
************************************/
function getFiles(folderId) {
  var fileProps = [];
  var folder = DriveApp.getFolderById(folderId);
  var contents = folder.getFiles();
  while(contents.hasNext()) {
    var file = contents.next();
    var name = file.getName();
    var id = file.getId();
    var obj = {};
    obj["name"] = name;
    obj["id"] = id;
    fileProps.push(obj);
  }
  var sorted = objSort(fileProps);
  return fileProps;
}

/************************************
並べ替える
************************************/
function objSort(fileProps) {
  var ascending = fileProps.sort(asc);
  return ascending;
}

/************************************
nameで昇順に並べ替える
************************************/
function asc(a, b){
  var A = a.name;
  var B = b.name;
  if(A > B){
    return 1;
  }else if(A < B ){
    return -1;
  }else{
   return 0;
  }
}



関連記事

複数のスプレッドシートをひとつにまとめたい(シート1)
ノート(メモ)を取得する
ノートを入力する



機種変で三菱UFJのワンタイムパスワードの再設定をした


Pixecl 3aに機種変更したら三菱UFJ銀行のワンタイムパスワードの利用登録が再度必要だったのでやった手順を書き残しておこう。



ここに書かれている手順をやりました。
(キャプチャは撮り忘れました)

利用開始までの流れ
https://direct.bk.mufg.jp/secure/otp/app.html#unk01


登録手順
  1. アプリをインストールする
  2. アプリを開いてログインする
  3. 左下の青い「三」みたいなメニューボタンを押す
  4. 「ワンタイムパスワード利用登録」を押す
  5. 「次へ」を押す(これは書かれていなかった)
  6. 注意事項と利用規定を開いて読んで「ワンタイムパスワード利用登録開始」を押す
  7. 自動音声案内用の電話番号を選択する
  8. 0120-881-378から自動音声の電話がかかってくる
  9. 設定用番号が自動音声で流れるのでメモる
  10. 電話を切ってアプリの入力欄に入力する
  11. 利用登録を押す



ログアウトしてアプリを開くとログイン画面が表示されて
その画面からワンタイムパスワードを表示できるようになりました。



参考

2019年6月22日土曜日

複数のスプレッドシートをひとつにまとめたい(シート1)


同一のカラム構成で複数のスプレッドシートがひとつのフォルダに入っていて、
それらをひとつのシートにまとめたくて書いたコードです。



例として以下のような2つのスプレッドシートがあって


1つ目のスプレッドシートのシート1(edit#gid=0)
ABC
1IDTITLEDATE
2axxxxxxTITLE-1DATE-1
3bxxxxxxTITLE-2DATE-2
4cxxxxxxTITLE-3DATE-3
5dxxxxxxTITLE-4DATE-4
6exxxxxxTITLE-5DATE-5


2つ目のスプレッドシートのシート1(edit#gid=0)
ABC
1IDTITLEDATE
2fxxxxxxTITLE-6DATE-6
3gxxxxxxTITLE-7DATE-7
4hxxxxxxTITLE-8DATE-8
5ixxxxxxTITLE-9DATE-9
6jxxxxxxTITLE-10DATE-10
7kxxxxxxTITLE-11DATE-11
8lxxxxxxTITLE-12DATE-12



その2つのシートをまとめてこういう3つ目のシートを作りたい
ABC
1IDTITLEDATE
2axxxxxxTITLE-1DATE-1
3bxxxxxxTITLE-2DATE-2
4cxxxxxxTITLE-3DATE-3
5dxxxxxxTITLE-4DATE-4
6exxxxxxTITLE-5DATE-5
7fxxxxxxTITLE-6DATE-6
8gxxxxxxTITLE-7DATE-7
9hxxxxxxTITLE-8DATE-8
10ixxxxxxTITLE-9DATE-9
11jxxxxxxTITLE-10DATE-10
12kxxxxxxTITLE-11DATE-11
13lxxxxxxTITLE-12DATE-12


やりたいことを簡単に言うと
1つ目のシートと2つ目のシートの2行目から最終行までのデータを取得して
3つ目のシートにまとめる
そして1列目を昇順で並べ替える



FOLDER_ID と SPREADSHEET_URL を設定して
runGetAndSetValues() を実行する

コード.gs
var targetFolderId = 'FOLDER_ID';// 複数のシートが入っているフォルダID
var masterSheetUrl = 'SPREADSHEET_URL';// まとめるスプレッドシートのURL

var targetSpreadsheets = getFiles(targetFolderId);

/************************************
これを実行する
************************************/
function runGetAndSetValues() {
  var ssIds = getSsIds(targetSpreadsheets);
  setHeaderValues(ssIds);
  for(var i = 0; i < ssIds.length; i++) {
    var sheetValues = getSheetValues(ssIds[i]);
    var sheet = SpreadsheetApp.openByUrl(masterSheetUrl).getSheets()[0];
    setSheetValues(sheet, sheetValues);
  }
  sort(sheet);
}

/************************************
一行目に見出しの値を入れる
************************************/
function setHeaderValues(ssIds) {
  var headerValues = getHeaderValues(ssIds);
  Logger.log(headerValues)
  var ss = SpreadsheetApp.openByUrl(masterSheetUrl);
  var sheet = ss.getSheets()[0];
  var range = sheet.getRange(1, 1, 1, headerValues[0].length);
  range.setValues(headerValues);  
}

/************************************
一行目に入れる見出しの値を取得する
************************************/
function getHeaderValues(ssIds) {
  var ssId = ssIds[0];
  var ss = SpreadsheetApp.openById(ssId);
  var sheet = ss.getSheets()[0];
  var last_col = sheet.getLastColumn();
  var range = sheet.getRange(1, 1, 1, last_col);
  var headerValues = range.getValues();
  return headerValues;
}

/************************************
対象のスプレッドシートのIDを取得して返す
************************************/
function getSsIds(targetSpreadsheets) {
  var ssIds = [];
  for(var i = 0; i < targetSpreadsheets.length; i++) {
    ssIds.push(targetSpreadsheets[i]['id']);
  }
  return ssIds;
}

/************************************
シートの値を取得して返す
************************************/
function getSheetValues(ssId) {
  var ss = SpreadsheetApp.openById(ssId);
  var sheet = ss.getSheets()[0];
  var lastRow = sheet.getLastRow();
  var lastCol = sheet.getLastColumn();
  var range = sheet.getRange(2, 1, lastRow, lastCol);// 一行目はヘッダなので2行目から取得する
  var values = range.getValues();
  return values;
}

/************************************
シートに値を一気に入力する
************************************/
function setSheetValues(sheet, array){
  var lastRow = sheet.getLastRow();
  var startRow = lastRow + 1;
  var startCol = 1;
  var numRows = array.length;
  var numCols = array[0].length;
  var range = sheet.getRange(startRow, startCol, numRows, numCols);
  range.setValues(array); 
}

function sort(sheet){  
  var range = sheet.getRange(2, 1, sheet.getLastRow(), sheet.getLastColumn());
  range.sort([{column: 1, ascending: true}]);
}

/************************************
フォルダ内のファイルを取得して
昇順にして返す
************************************/
function getFiles(targetFolderId) {
  var fileProps = [];
  var folder = DriveApp.getFolderById(targetFolderId);
  var contents = folder.getFiles();
  while(contents.hasNext()) {
    var file = contents.next();
    var name = file.getName();
    var id = file.getId();
    var obj = {};
    obj["name"] = name;
    obj["id"] = id;
    fileProps.push(obj);
  }
  var sorted = objSort(fileProps);
  return fileProps;
}

/************************************
並べ替える
************************************/
function objSort(fileProps) {
  var ascending = fileProps.sort(asc);
  return ascending;
}

/************************************
nameで昇順に並べ替える
************************************/
function asc(a, b){
  var A = a.name;
  var B = b.name;
  if(A > B){
    return 1;
  }else if(A < B ){
    return -1;
  }else{
   return 0;
  }
}



関連記事

シートの1行目(ヘッダ行)の値を取得する
ヘッダの文字列を用意してシートの一行目に自動で入力したい
setValuesを使う話
Googleドライブ内のフォルダをフォルダ名で並べ替えて取得したい
シートのデータを昇順・降順でソートする

2019年6月17日月曜日

SoftBankスマホでテザリングしたい


テザリングオプションへの加入
が必要だったので設定した手順を書き残しておきます。


テザリングの加入を申し込む手順


スマホでMy SoftBankを開きます
https://www.softbank.jp/mysoftbank/


「契約・オプション管理」を選択します


「オプション」を開きます


「サービス一覧をみる」を選択します


「た行」を選択して
テザリングオプションの「加入」を選択します


月額500円かかるらしい


ご連絡先を選択して
同意するにチェックして
「申込」を選択します


しばらく待つとこのような通知が来てテザリングできるようになりました


参考

My SoftBankでのお手続き
https://www.softbank.jp/support/faq/view/11590

テザリング設定(スマートフォン)
https://www.softbank.jp/mobile/network/tethering/smartphone/

Pixel 3aでモバイルSuicaが反応しなくてNFCをONにした


朝ごはんをモバイルSuicaで支払おうとしたら全く反応しなくて困った。

初期不良かとも思いながら調べてみると、NFCをオンにしたら解決しました。

ちなみに、Pixel 3aは背面の指紋センサーの位置にFeliCa チップが取り付けられている。


NFCをオンにする手順


「設定」を開きます


「接続済みの端末」を選択します


「接続の設定」を選択します


「NFC」の右端のボタンをオンにします


これでNFCがオンになって、モバイルSuicaが使えるようになりました。


参考

Pixel スマートフォンのハードウェアの図
https://support.google.com/pixelphone/answer/7157629?hl=ja

Pixel Phone ヘルプ
https://support.google.com/pixelphone/thread/792032?hl=ja
https://support.google.com/pixelphone/thread/792701

2019年6月16日日曜日

モバイルSuicaを新機種に移行したい


旧機種の情報を一時的にセンターサーバに移して、新機種でそれを読み込むらしい

モバイルSuica 各種手続き 機種変更 に書かれていました
https://www.jreast.co.jp/mobilesuica/procedure/chg_model.html


旧機種側でやること


AndroidでモバイルSuicaを起動して
「同意する」または(以降確認なし)を選択します


モバイルSuicaが起動します


右上の「その他」を選択します


「会員メニュー」を選択します


ログインします


「会員メニュー」を選択します


「携帯情報端末の機種変更」を選択します


「機種変更する」を選択します


処理が始まります


処理完了後、「終了する」を選択します

これで旧機種側でやることは終了です


新機種側でやること


モバイルSuicaを起動します

初期化で「はい」を選択します


右上の「再発行・機種変更の方はこちら」を選択します


ログインします


「初期設定する」を選択します


「実行する」を選択します


機種変更が完了しました


参考

モバイルSuica 各種手続き 機種変更
https://www.jreast.co.jp/mobilesuica/procedure/chg_model.html

Latest post

Google Apps Scriptの障害時はIssueTrackerを見てみる - Incidents for Apps Script are reported on Issue Tracker

IssueTracker > Apps Script issues https://issuetracker.google.com/savedsearches/566234 Google Apps Scriptの障害時は IssueTracker に課題が上がっていることが...