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

2019年12月31日火曜日

HTML要素で共通のグローバル属性を知りたい


すべてのHTML要素で共通の属性がある

その一覧が書かれているページへのリンク

グローバル属性
https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes



オブジェクトの特定のキーの値が大きい順に2次元配列を作りたい


言語化するのが難しいのでたぶんこのページに辿り着く人は少ないと思いますが
備忘録として書き残しておきます


今回やりたかったこと

こういうオブジェクトがあるときに
[
    {
      "text": "your",
      "count": 1129
    }, {
      "text": "take",
      "count": 994
    }, {
      "text": "time",
      "count": 872
    }
  ];
}

"take your time"
という文字列を与えて

countの数値が大きい順に並べ替えてこういう二次元配列を作る
 [[your, 1129.0], [take, 994.0], [time, 872.0]]



最初はこういうオブジェクトを作ろうかと思った
{
  "your": 1129,
  "take": 994,
  "time": 872,
}

けれどオブジェクトの順番は保証されないので二次元配列で返すことにしました



コード.gs
function myFunction() {
  var str = "take your time";
  var objsArray = returnObj();
  var sortedArrays = run(objsArray, str);
  Logger.log(sortedArrays);
}

function run(objsArray, str) {
  var strArray = str.split(" ");
  var obj = {};
  for(var i = 0; i < strArray.length; i++) {
    var value = strArray[i]
    var count = filterObj(objsArray, value);
    obj[value] = count;
  }
  var sortedArrays = getSortedArrays(obj);
  return sortedArrays;
}

function getSortedArrays(obj) {
  var keys = Object.keys(obj);
  var values = []
  for (var i = 0; i < keys.length; i++) {
    var key = keys[i];
    var value = obj[key];
    values.push([key, value]);
  }
  var arrays = getSort(values);
  return arrays;
}

function getSort(array) {
  array.sort(sorting);
  return array;
}

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

function returnObj() {
  var objsArray = [
    {
      "text": "your",
      "count": 1129
    }, {
      "text": "take",
      "count": 994
    }, {
      "text": "time",
      "count": 872
    }
  ];
  return objsArray;
}

function filterObj(objsArray, value) {
  var filtered = objsArray.filter(function(items) { return items["text"] === value; });
  var count = filtered[0]["count"];
  return count;
}




2019年12月30日月曜日

テキストエリア内で折り返しを無効にするwrap="off"


<textarea wrap="off"></textarea>

とすることで
端で折り返されるテキストが折り返されなくなる


デモ
wrap="off"


wrap="on"
または指定なし




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




index.html
<!DOCTYPE html>
<html>
  <body>
    <textarea wrap="off"></textarea>
  </body>
</html>


押したキーのkeyCodeとキーをセットで取得したい


キーとkeyCodeをマッピングしたオブジェクトを作りたかったので

こういうアウトプットになるようにする

"a": 65,
"b": 66,
"c": 67,




デモ
上のテキストエリアに入力された文字とkeyCodeが下のテキストエリアに表示される
(半角英数)
keyCode





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




index.html
<!DOCTYPE html>
<html>
  <head>
    <style>
      #ta2 {
        height: 90vh;
      }
    </style>
  </head>
  <body>
    <textarea id="ta"></textarea>
    <br>
    <textarea id="ta2"></textarea>
<script>
function elem(id) {
  return document.getElementById(id);
}

elem('ta').onkeydown = taKeyDown;

function taKeyDown(e) {
  var key = e.key;
  var code = e.keyCode;
  var ta2 = elem('ta2');
  var text = '"' + key + '": ' + code;
  ta2.value = ta2.value + text + ',\n';
}
</script>
  </body>
</html>


押したキーのcharCodeと文字をセットで取得したい


文字とcharCodeをマッピングしたオブジェクトを作りたかったので

こういうアウトプットになるようにする

"a": 97,
"b": 98,
"c": 99,




デモ
上のテキストエリアに入力された文字とcharCodeが下のテキストエリアに表示される
(半角英数)
charCode





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




index.html
<!DOCTYPE html>
<html>
  <head>
    <style>
      #ta2 {
        height: 90vh;
      }
    </style>
  </head>
  <body>
    <textarea id="ta"></textarea>
    <br>
    <textarea id="ta2"></textarea>
<script>
function elem(id) {
  return document.getElementById(id);
}

elem('ta').onkeypress = taKeyPress;

function taKeyPress(e) {
  var key = e.key;
  var code = e.charCode;
  var ta2 = elem('ta2');
  var text = '"' + key + '": ' + code;
  ta2.value = ta2.value + text + ',\n';
}
</script>
  </body>
</html>


補足

この記事ではキーとなる文字をダブルクオートで囲んでいるので
ダブルクオート自体をキーにする場合はシングルクオートで囲み直す

ダブルクオートを入力するとこうなる

ここだけこうしてやる
'"': 34


関連記事

押したキーの情報を取得したい
keyCodeとcharCodeを知りたい

2019年12月29日日曜日

keyCodeとcharCodeを知りたい


keyCodeとcharCodeを全部知りたくて手元のMacbookで取得した



keyCode.gs
function returnKeyCodeObj() {
  var keyCodeObj = {
    "esc": 27,
    "F1": 112,
    "F2": 113,
    "F3": 114,
    "F4": 115,
    "F5": 116,
    "F6": 117,
    "F7": 118,
    "F8": 119,
    "F9": 120,
    "F10": 121,
    "F11": 122,
    "F12": 123,
    "1": 49,
    "2": 50,
    "3": 51,
    "4": 52,
    "5": 53,
    "6": 54,
    "7": 55,
    "8": 56,
    "9": 57,
    "0": 48,
    "-": 189,
    "^": 187,
    "¥": 0,
    "delete": 8,
    "tb": 84,
    "q": 81,
    "w": 87,
    "e": 69,
    "r": 82,
    "y": 89,
    "u": 85,
    "i": 73,
    "o": 79,
    "p": 80,
    "@": 219,
    "[": 219,
    "enter": 13,
    "control": 17,
    "a": 65,
    "s": 83,
    "d": 68,
    "f": 70,
    "g": 71,
    "h": 72,
    "j": 74,
    "k": 75,
    "l": 76,
    ";": 186,
    ":": 186,
    "]": 221,
    "shift": 16,
    "z": 90,
    "x": 88,
    "c": 67,
    "v": 86,
    "b": 66,
    "n": 78,
    "m": 77,
    ",": 188,
    ".": 190,
    "/": 191,
    "_": 189,
    "caps": 20,
    "option": 18,
    "command": 93,
    "英数": "",
    "スペース": 32,
    "かな": "",
    "fn": "",
    "◀": 37,
    "▲": 38,
    "▼": 40,
    "▶": 39
  }
  return keyCodeObj;
}



charCode.gs
function returnCharCodeObj() {
  var charCodeObj = {
    "1": 49,
    "2": 50,
    "3": 51,
    "4": 52,
    "5": 53,
    "6": 54,
    "7": 55,
    "8": 56,
    "9": 57,
    "0": 48,
    "-": 45,
    "^": 94,
    "¥": 165,
    "q": 113,
    "w": 119,
    "e": 101,
    "r": 114,
    "t": 116,
    "y": 121,
    "u": 117,
    "i": 105,
    "o": 111,
    "p": 112,
    "@": 64,
    "[": 91,
    "a": 97,
    "s": 115,
    "d": 100,
    "f": 102,
    "g": 103,
    "h": 104,
    "j": 106,
    "k": 107,
    "l": 108,
    ";": 59,
    ":": 58,
    "]": 93,
    "z": 122,
    "x": 120,
    "c": 99,
    "v": 118,
    "b": 98,
    "n": 110,
    "m": 109,
    ",": 44,
    ".": 46,
    "/": 47,
    "_": 95,
    "!": 33,
    '"': 34,
    "#": 35,
    "$": 36,
    "%": 37,
    "&": 38,
    "'": 39,
    "(": 40,
    ")": 41,
    "0": 48,
    "=": 61,
    "~": 126,
    "|": 124,
    "Q": 81,
    "W": 87,
    "E": 69,
    "R": 82,
    "T": 84,
    "Y": 89,
    "U": 85,
    "I": 73,
    "O": 79,
    "P": 80,
    "`": 96,
    "{": 123,
    "A": 65,
    "S": 83,
    "D": 68,
    "F": 70,
    "G": 71,
    "H": 72,
    "J": 74,
    "K": 75,
    "L": 76,
    "+": 43,
    "*": 42,
    "}": 125,
    "Z": 90,
    "X": 88,
    "C": 67,
    "V": 86,
    "B": 66,
    "N": 78,
    "M": 77,
    "<": 60,
    ">": 62,
    "?": 63,
    "_": 95,
    " ": 32
  }
  return charCodeObj;
}


押したキーの情報を取得したい


KeyboardEvent の中で以下のプロパティの値を取得した時の備忘録

charCodeはkeypressで他はkeydownで取得しています


デモ

keyCode
which
code
key
altKey
ctrlKey
shiftKey
metaKey
charCode




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




index.html
<!DOCTYPE html>
<html>
  <body>
    <table>
      <tbody>
        <tr><td>keyCode</td><td id="keyCode"></td></tr>
        <tr><td>which</td><td id="which"></td></tr>
        <tr><td>code</td><td id="code"></td></tr>
        <tr><td>key</td><td id="key"></td></tr>
        <tr><td>altKey</td><td id="altKey"></td></tr>
        <tr><td>ctrlKey</td><td id="ctrlKey"></td></tr>
        <tr><td>shiftKey</td><td id="shiftKey"></td></tr>
        <tr><td>metaKey</td><td id="metaKey"></td></tr>
        <tr><td>charCode</td><td id="charCode"></td></tr>
      </tbody>
    </table>
<script>
document.body.onkeydown = bodyKeyDown;
document.body.onkeypress = bodyKeyPress;

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

function bodyKeyDown(e) {
  elem("keyCode").textContent = e.keyCode;
  elem("which").textContent = e.which;  
  elem("code").textContent = e.code;
  elem("key").textContent = e.key;
  elem("altKey").textContent = e.altKey;
  elem("ctrlKey").textContent = e.ctrlKey;
  elem("shiftKey").textContent = e.shiftKey;
  elem("metaKey").textContent = e.metaKey;
}

function bodyKeyPress(e) {
  elem("charCode").textContent = e.charCode;
}
</script>
  </body>
</html>


押したキーのkeyCodeを連続して取得したい


半角英数モードで
上のテキストエリアでキーボードの任意のキーを押したときに
下のテキストエリアに改行つなぎでkeyCodeを書き出したくて作りました。


デモ





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




index.html
<!DOCTYPE html>
<html>
  <head>
    <style>
      #ta2 {
        height: 90vh;
      }
    </style>
  </head>
  <body>
    <textarea id="ta"></textarea>
    <br>
    <textarea id="ta2"></textarea>
<script>
document.getElementById('ta').onkeydown = taKeyDown;

function taKeyDown(e) {
  var code = e.keyCode;
  console.log(code);
  var ta2 = document.getElementById('ta2');
  ta2.value = ta2.value + code + '\n';
}
</script>
  </body>
</html>


2019年12月28日土曜日

Workplaceのカスタムアプリの作成権限と管理者の役割を知りたい


GET / POSTのAPIやWebhookを設定できるのはシステム管理者だけのようです


管理者には「管理者パネル」の項目がチャットアイコンの下に表示されます


「カスタムアプリを作成」する

「管理者パネル」で
①をクリックして
②をクリックして
③でカスタムアプリを作成できます


「システム管理者」の権限



「コンテンツモデレーター」の権限



「アカウントマネージャ」の権限



「アナリスト」の権限


2019年12月27日金曜日

シートのA列の英語をB列に日本語翻訳したい(スクリプトのプロパティを使ってみる)


スプレッドシートのA列に入力されている英語を日本語に翻訳してB列に入れたい

シートのA列の英語をB列に日本語翻訳したい(トリガーでやってみる)
ではトリガーで実行する際にB列の開始行を取得しました

今回は
B列の開始行をスクリプトのプロパティを使って読み書きする方法を試しました



実行前


実行後



サンプルデータ
englishjapanese
candy
chocolate
gum
caramel
cake
cream puff
chips
pancake
biscuit
pudding
cookie




コード4.gs
function myFunction() {
  var numRow = 5;// 一度に取得する行数
  var iterate = 2;// 繰り返す回数
  var getStartCol = 1;// 値を取得する列番号 A列なら1
  var setStartCol = 2;// 値を入力する列番号 B列なら2
  var initialRow = 2;// 開始行の初期値 1行目が見出しなら2行目から
  
  var ssUrl = 'https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=0';
  var sheet = getTargetSheet(ssUrl)
  var lastRow = sheet.getLastRow();
  var resultArray = [];
  var startRow = getProp('startRow');

  for(var i = 0; i < iterate; i++) {
    var nextStartRow = getProp('startRow');
    var range = sheet.getRange(nextStartRow, getStartCol, numRow, 1);
    var values = range.getDisplayValues();
    values = arrayPushApply(values);
    values = values.filter(function(value) { return value !== ''; });

    if(values.length > 0) {
      resultArray.push(values);
      setProp('startRow', parseInt(nextStartRow) + numRow);
    } else {
      setProp('startRow', initialRow);// 初期値に戻す
      deleteTrigger('myFunction');
    }
  }
  
  resultArray = arrayPushApply(resultArray);
  setTranslated(sheet, startRow, setStartCol, resultArray);
}

function setTranslated(sheet, startRow, setStartCol, resultArray) {
  var translateds = [];
  for(var i = 0; i < resultArray.length; i++) {
    var value = resultArray[i];
    var translated = LanguageApp.translate(value, "", "ja");
    translateds.push([translated])
  }
  var range = sheet.getRange(startRow, setStartCol, translateds.length, 1);
  range.setValues(translateds);
}


//二次元配列を一次元配列にして返す
function arrayPushApply(array){
  for(var i = 1; i < array.length; i++){
    Array.prototype.push.apply(array[0], array[i]);
  }
  return array[0]
}

function getTargetSheet(ssUrl) {
  var ss = SpreadsheetApp.openByUrl(ssUrl);
  var sheetId = ssUrl.split("gid=")[1];
  var sheets = ss.getSheets();
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].getSheetId() == sheetId) {
      break;
    }
  }
  var sheet = ss.getSheets()[i];
  return sheet;
}

function deleteTrigger(functionName) {
  var allTriggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < allTriggers.length; i++) {
    if (allTriggers[i].getHandlerFunction() == functionName) {
      ScriptApp.deleteTrigger(allTriggers[i]);
      break;
    }
  }
}

function getProp(key) {
  return PropertiesService.getScriptProperties().getProperty(key);
}

function setProp(key, value) {
  PropertiesService.getScriptProperties().setProperty(key, value);
}



関連記事

シートのA列の英語をB列に日本語翻訳したい(一気にやる)
シートのA列の英語をB列に日本語翻訳したい(B列最終行の次から)
シートのA列の英語をB列に日本語翻訳したい(トリガーでやってみる)

シートのA列の英語をB列に日本語翻訳したい(トリガーでやってみる)


今回やりたいこと

スプレッドシートのA列に入力されている英語を日本語に翻訳してB列に入れたい

シートのA列の英語をB列に日本語翻訳したい(一気にやる)
シートのA列の英語をB列に日本語翻訳したい(B列最終行の次から)
では手動で実行するコードを書きました


件数が多い場合は実行時間制限(6分)にぶつかるので
今回はトリガーを使って試しました
  • 1分ごとのトリガーにmyFunction()を設定すると
  • 1分ごとに実行されて、最終行まで実行したらトリガーが自動で削除される



一日に翻訳できる量には制限があります
その上限を越えるとその日はそれ以上実行できなくなります



実行前


実行後



サンプルデータ
englishjapanese
candy
chocolate
gum
caramel
cake
cream puff
chips
pancake
biscuit
pudding
cookie




コード3.gs
var sourceLang = '';// 翻訳元の言語を空にしておくと自動判定してくれる
var targetLang = 'ja';// この言語に翻訳する 言語の種類は→https://cloud.google.com/translate/docs/languages
var sourceCol = 1;// 値を取得する列
var targetCol = 2;// 書き込む列
var numRow = 5;// 一度に取得する行数
var iterate = 2;// 繰り返す回数

function myFunction() {
  var ssUrl = 'https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=0';
  var sheet = getTargetSheet(ssUrl);
  var lastRow = sheet.getLastRow();

  for(var i = 0; i < iterate; i++) {
    var resultArray = [];
    var lastRowB = getLastRowAt(sheet, targetCol);
    var startRow = lastRowB + 1;
    var numRows = lastRow - lastRowB;
    var range = sheet.getRange(startRow, sourceCol, numRow, 1);
    var values = range.getDisplayValues();
    values = arrayPushApply(values);
    values = values.filter(function(value) { return value !== ''; });
    if(values.length > 0) {
      resultArray.push(values);
      resultArray = arrayPushApply(resultArray);
      setTranslated(sheet, startRow, resultArray);
    } else {
      deleteTrigger('myFunction');
    }
  }
}

function setTranslated(sheet, startRow, resultArray) {
  var translateds = [];
  for(var i = 0; i < resultArray.length; i++) {
    var value = resultArray[i];
    var translated = LanguageApp.translate(value, sourceLang, targetLang);
    translateds.push([translated])
  }
  var range = sheet.getRange(startRow, targetCol, translateds.length, 1);
  range.setValues(translateds);
}

//二次元配列を一次元配列にして返す
function arrayPushApply(array){
  for(var i = 1; i < array.length; i++){
    Array.prototype.push.apply(array[0], array[i]);
  }
  return array[0];
}

function getTargetSheet(ssUrl) {
  var ss = SpreadsheetApp.openByUrl(ssUrl);
  var sheetId = ssUrl.split("gid=")[1];
  var sheets = ss.getSheets();
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].getSheetId() == sheetId) {
      break;
    }
  }
  var sheet = ss.getSheets()[i];
  return sheet;
}

function getLastRowAt(sheet, col) {
  var startRow = 1;
  var numCols = 1;
  var lastRow = sheet.getLastRow();
  var values = sheet.getRange(startRow, col, lastRow, numCols).getValues();
  for (var i = values.length - 1; i >= 0; i--) {
    if (values[i] != "") {
      break;
    }
  }
  var lastRowAt = i + 1;
  return lastRowAt;
}

function deleteTrigger(functionName) {
  var allTriggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < allTriggers.length; i++) {
    if (allTriggers[i].getHandlerFunction() == functionName) {
      ScriptApp.deleteTrigger(allTriggers[i]);
      break;
    }
  }
}



関連記事

シートのA列の英語をB列に日本語翻訳したい(一気にやる)
シートのA列の英語をB列に日本語翻訳したい(B列最終行の次から)

シートのA列の英語をB列に日本語翻訳したい(B列最終行の次から)


今回やりたいこと

スプレッドシートのA列に入力されている英語を日本語に翻訳してB列に入れたい

シートのA列の英語をB列に日本語翻訳したい(一気にやる)
ではB列の値すべてを一気に翻訳しました


今回は
B列に入力されている値の最終行を取得してその次の行から翻訳してみる



実行前


実行後



サンプルデータ
englishjapanese
candy
chocolate
gum
caramel
cake
cream puff
chips
pancake
biscuit
pudding
cookie




コード2.gs
var sourceLang = '';// 翻訳元の言語を空にしておくと自動判定してくれる
var targetLang = 'ja';// この言語に翻訳する 言語の種類は→https://cloud.google.com/translate/docs/languages
var sourceCol = 1;// 値を取得する列
var targetCol = 2;// 書き込む列

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var lastRowB = getLastRowAt(sheet, targetCol);
  var startRow = lastRowB + 1
  var numRows = lastRow - lastRowB;
  var resultArray = [];
  var range = sheet.getRange(startRow, sourceCol, numRows, 1);
  var values = range.getDisplayValues();
  values = arrayPushApply(values);
  values = values.filter(function(value) { return value !== ''; });
  setTranslated(sheet, startRow, values);
}

function setTranslated(sheet, startRow, resultArray) {
  var translateds = [];
  for(var i = 0; i < resultArray.length; i++) {
    var value = resultArray[i];
    var translated = LanguageApp.translate(value, sourceLang, targetLang);
    translateds.push([translated])
  }
  var range = sheet.getRange(startRow, targetCol, translateds.length, 1);
  range.setValues(translateds);
}

//二次元配列を一次元配列にして返す
function arrayPushApply(array){
  for(var i = 1; i < array.length; i++){
    Array.prototype.push.apply(array[0], array[i]);
  }
  return array[0]
}

function getLastRowAt(sheet, col) {
  var start_row = 1;
  var num_cols = 1;
  var sh_last_row = sheet.getLastRow();
  var values = sheet.getRange(start_row, col, sh_last_row, num_cols).getValues();
  for (var i = values.length - 1; i >= 0; i--) {
    if (values[i] != "") {
      break;
    }
  }
  var last_row = i + 1;
  return last_row;
}




関連記事

シートのA列の英語をB列に日本語翻訳したい(一気にやる)

シートのA列の英語をB列に日本語翻訳したい(一気にやる)


今回やりたいこと

スプレッドシートのA列に入力されている英語を日本語に翻訳してB列に入れたい



実行前


実行後



サンプルデータ
englishjapanese
candy
chocolate
gum
caramel
cake
cream puff
chips
pancake
biscuit
pudding
cookie


最終行までを取得して、全部一気に翻訳してみる

コード1.gs
var sourceLang = '';// 翻訳元の言語を空にしておくと自動判定してくれる
var targetLang = 'ja';// この言語に翻訳する 言語の種類は→https://cloud.google.com/translate/docs/languages

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var startRow = 2;
  var lastRow = sheet.getLastRow();
  var resultArray = [];
  var range = sheet.getRange(startRow, 1, lastRow, 1);
  var values = range.getDisplayValues();
  values = arrayPushApply(values);
  values = values.filter(function(value) { return value !== ''; });
  setTranslated(sheet, startRow, values);
}

function setTranslated(sheet, startRow, resultArray) {
  var translateds = [];
  for(var i = 0; i < resultArray.length; i++) {
    var value = resultArray[i];
    var translated = LanguageApp.translate(value, sourceLang, targetLang);
    translateds.push([translated])
  }
  var range = sheet.getRange(startRow, 2, translateds.length, 1);
  range.setValues(translateds);
}

//二次元配列を一次元配列にして返す
function arrayPushApply(array){
  for(var i = 1; i < array.length; i++){
    Array.prototype.push.apply(array[0], array[i]);
  }
  return array[0]
}





2019年12月24日火曜日

Yahoo!ドメインでメールアドレスを追加したい


Yahoo! ドメインでメールアドレスを作成する手順の備忘録



ドメイン側とメール側の両方で設定が必要です

今回はYahoo!のメールで設定したのでその手順を書いていきます
  1. Yahoo! ドメイン側の設定
  2. Yahoo! メール側の設定



1.Yahoo! ドメイン側の設定

https://domains.yahoo.co.jp/にアクセスして
「ドメインコントロールパネル」をクリックします


対象のドメイン名をクリックします


「メール転送設定」をクリックします


「メールアドレス」と「メール転送先」を決めて「新規作成」をクリックします


「設定」をクリックします



2.Yahoo! メール側の設定


「設定・利用規約」をクリックして「メールの設定」を選択します


「メールアカウント」をクリックします


「外部メールの設定」をクリックします


「OK」をクリックします


「追加」をクリックします


必要な箇所を入力します
(メールサーバーは「yahoo」にしました)


「保存」を押して、その後は手順通りに確認コードでメール確認をして完了です。



参考

途中までここに書かれていました
https://domains.yahoo.co.jp/promotion/guide/yahoomail01.html

シートの複数列のデータをそれぞれ一次元配列で取得したい2(オブジェクト)


A, B, C列に値が入っていて列ごとにデータを取得したい


そしてこのようにオブジェクトにしたい
{
  col1=[a1, a2, a3, a4, a5],
  col2=[b1, b2, b3, b4, b5],
  col3=[c1, c2, c3, c4, c5]
}





コード.gs
function getMultipleColsData() {
  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];
  var lastRow = sheet.getLastRow();
  var lastCol = sheet.getLastColumn();
  
  var obj = {};
  for(var i = 0; i < lastCol; i++) {
    
    var targetCol = i + 1;
    var range = sheet.getRange(1, targetCol, lastRow, 1);
    var values = range.getDisplayValues();
    var array = values.map(function(array) { return array[0] });
    obj['col' + targetCol] = array;

  }
  Logger.log(obj);
}


関連記事

シートの複数列のデータをそれぞれ一次元配列で取得したい

シートの複数列のデータをそれぞれ一次元配列で取得したい


A, B, C列に値が入っていて列ごとにデータを取得したい


このように
 [[a2, a3, a4, a5, ], [b2, b3, b4, b5, ], [c2, c3, c4, c5, ]]



コード.gs
function getMultipleColsData() {
  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];
  var lastRow = sheet.getLastRow();
  var lastCol = sheet.getLastColumn();
  
  var arrays = [];
  for(var i = 0; i < lastCol; i++) {
    var targetCol = i + 1;
    var range = sheet.getRange(1, targetCol, lastRow, 1);
    var values = range.getDisplayValues();
    var array = values.map(function(array) { return array[0] });
    arrays.push(array);
  }
  Logger.log(arrays);
}




2019年12月21日土曜日

MacのAutomatorでPDFをJPEGに変換したい


今回やること

フォルダ内にあるPDFファイルをJPEGファイルに変換する
  1. フォルダをアプリにドラッグ&ドロップする
  2. フォルダ内のPDFファイルをJPEGに変換する
  3. 保存するフォルダを選択して保存する
  4. ファイル名の連番を4桁でつけ直す


アプリを作るステップ

STEP 1
Finder > アプリケーション > Automator を開きます


STEP 2
「アプリケーション」を選択して「選択」をクリックします


STEP 3
「フォルダの内容を取得」をダブルクリックで右に追加します


STEP 4
「PDFページをイメージとしてレンダリング」をダブルクリックして右に追加します
フォーマットを「JPEGイメージ」に設定します


STEP 5
「Finder項目をコピー」をダブルクリックして右に追加します
「オプション」をクリックして
「ワークフローの実行前にこのアクションを表示」をチェックします



STEP 6
「Finder項目の名前を変更」をダブルクリックして右に追加する
「連番付きの名前にする」を設定する
「すべての番号を」「4」桁にする


STEP 7
ファイル > 保存 を選択する


STEP 8
名前を決めて「保存」する


実行方法

  1. Finder > 書類 を開くと作成した「PDFtoJPEG」アプリが保存されています
  2. このアプリにPDFファイルが入ったフォルダをドラッグ&ドロップします
  3. しばらくすると保存先を聞かれるので指定します
  4. しばらくすると指定した保存先にJPEGファイルが書き出されます



参考

Automator
https://support.apple.com/ja-jp/HT2488

スプレッドシートに用意したHTMLをindex.htmlに表示してみる


Google Apps ScriptのHtmlServiceで
index.htmlに表示するHTMLをスプレッドシートから読み込みたい

ということがやりたくて書いたコードです。


今回やること

表示したいHTMLをA1に用意しておく
(今回はテキストボックスを表示するだけ)

コード.gsに returnHtml() という関数を用意して
スプレッドシートのA1のデータを取得して返す
index.htmlの getHtml() でそれを実行して
返ってきたHTMLを innerHTML で表示する



コード.gs
function doGet(e) {
  return HtmlService.createHtmlOutputFromFile("index");
}

function returnHtmlFromSheet(){
  var ssUrl = 'https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit#gid=0';
  var sheet = SpreadsheetApp.openByUrl(ssUrl);
  var range = sheet.getRange('A1');
  var value = range.getValue();
  return value;
}



index.html
<!DOCTYPE html>
<html>
  <body>
    <div id="mainDiv"></div>

<script>

getHtml();
function getHtml() {
  google.script.run
  .withFailureHandler(onFailure)
  .withSuccessHandler(gotHtml)
  .returnHtmlFromSheet();
}

function gotHtml(result) {
  document.getElementById('mainDiv').innerHTML = result;
}

function onFailure(e) {
  alert([e.message, e.stack]);
}

</script>
</body>
</html>


gsファイルからHTMLタグを読み込んでindex.htmlに表示してみる


Google Apps Scriptの.gs側にHTMLを返す関数を用意して
index.html側で読み込んで表示する

ということがやりたくて書いたコードです。


今回やること

コード.gsにテキストエリアを返すだけの returnHtml() という関数を用意して
index.htmlの getHtml() でそれを実行して
返ってきたHTMLを innerHTML で表示する



コード.gs
function doGet(e) {
  return HtmlService.createHtmlOutputFromFile("index");
}

function returnHtml(){
  return "<textarea>hello</textarea>"; 
}




index.html
<!DOCTYPE html>
<html>
  <body>
    <div id="mainDiv"></div>

<script>

getHtml();
function getHtml() {
  google.script.run
  .withFailureHandler(onFailure)
  .withSuccessHandler(gotHtml)
  .returnHtml();
}

function gotHtml(result) {
  document.getElementById('mainDiv').innerHTML = result;
}

function onFailure(e) {
  alert([e.message, e.stack]);
}

</script>
</body>
</html>



スマホでタッチ操作したときのイベントを取得したい


Google Apps ScriptのHtml Serviceでスマホのタッチ操作の情報を取得してみる

今回取得したい情報

画面を指で触ったときの位置: start
指を離したときの位置: end
指が動いた距離: change




デモ
https://script.google.com/macros/s/AKfycbwZWp6v5V0T77NVzVKu4b9CQgzA2atqlIxpr3_Cpnt89bjVYtg/exec



コード.gs
function doGet(e) {
  return HtmlService.createHtmlOutputFromFile("index")
                    .addMetaTag("viewport", "width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=10.0");
}




index.html
<!DOCTYPE html>
  <html>
    <head>
      <style>
        .ta {
          width: 98%;
          height: 12em;
        }
      </style>
    </head>
    <body>
      <input type="text" id="startX" class="tb">: startX
      <input type="text" id="endX" class="tb">: endX
      <input type="text" id="startY" class="tb">: startY
      <input type="text" id="endY" class="tb">: endY
      <input type="text" id="changedX" class="tb">: changeX
      <input type="text" id="changedY" class="tb">: changeY
      <input type="text" id="type" class="tb">: type
      <br>
    </body>
    <script>
      document.ontouchstart = onTouch;
      document.ontouchmove = onTouch;
      document.ontouchend = onTouch;
    
      function elem(id) {
        return document.getElementById(id);
      }
    
      function onTouch(e) {
        var type = e.type;
        var touchList = e.changedTouches;
        var listLen = touchList.length;
        for (var i = 0; i < listLen; i++) { 
          var touch = touchList[i];
          var x = touch.screenX;
          var y = touch.screenY;

          switch(type) {
            case "touchstart":
              elem("startX").value = x;
              elem("startY").value = y;
              elem("endX").value = 0;
              elem("endY").value = 0;
              elem("changedX").value = 0;
              elem("changedY").value = 0;
              break;
            case "touchend":
              elem("endX").value = x;
              elem("endY").value = y;
              break;
            case "touchmove":
              elem("changedX").value = parseInt(elem("startX").value) - x;
              elem("changedY").value = parseInt(elem("startY").value) - y;
              break;
          }
            elem("type").value = type;
        }
      }
    </script>
  </html>
  


2019年12月19日木曜日

文章中にひらがなを含むかどうかを判定したい


matchとtestで試してみる

ひらがなの正規表現は
正規表現で文章からひらがなだけを抜き出したい /[ぁ-ゟー]+/g


matchで一致した文字列を返す
一致しなければnullを返す

コード.gs
function judgeIncudeHiraMatch() {
  var str = 'カタカナ漢字とeisu';
  var pattern = /.*[ぁ-ゟー].*/g;
  var result = str.match(pattern);
  Logger.log(result);
}


実行結果
「と」が含まれるので/.*[ぁ-ゟー].*/gに一致した文字列(前後の文字列を含む)を返す



testで一致したらtrue
一致しなければfalseを返す

コード.gs
function judgeIncudeHiraTest() {
  var str = 'カタカナ漢字eisu';
  var pattern = /.*[ぁ-ゟー].*/g;
  var result = pattern.test(str);
  Logger.log(result);
}


実行結果
ひらがな/.*[ぁ-ゟー].*/gに一致した文字列がないのでfalseを返す


関連記事

正規表現で文章からひらがなだけを抜き出したい /[ぁ-ゟー]+/g

データが入力されている最終行を取得する(上から見て最初に出現する空白セル取得)


データが入力されている最終行を取得する
では下から上にセルの値を見て最終行を取得しました

今回は上から下にセルの値をみて最初に出現する空白行を取得したくて
コードを書きました。

こういうケースで5行目を検出したい




コード.gs
function getLastRowFromTop() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getDataRange();
  var values = range.getValues();
  var targetCol = 0;// 対象の列番号 A列なら0
  var result;
  for(var i = 0; i < values.length; i++) {
    var value = values[i][targetCol];
    if(value === '') {
      result = i;
      break;
    }
  }
  Logger.log(result);
}


関連記事

データが入力されている最終行を取得する


2019年12月17日火曜日

スプレッドシートで「OK」「キャンセル」を選択するメッセージを表示したい


タイトル
メッセージ
OK、キャンセルボタンを表示して
選択された結果によって次の処理を分岐したい。




コード.gs
function myFunction() {
  var title = "タイトル";
  var prompt = "選択してください"
  var button = Browser.Buttons.OK_CANCEL
  var selection = Browser.msgBox(title, prompt, button);
  if(selection === "ok") {
    Browser.msgBox("OK!");
  }
  if(selection === "cancel") {
    Browser.msgBox("CANCEL!");
  }
}



参考

msgBox(title, prompt, buttons)
https://developers.google.com/apps-script/reference/base/browser#msgBox(String,String,ButtonSet)

2019年12月13日金曜日

A列の値を一次元配列で取得したい(指定した行数分ずつ実行したい)


こういうシートがあって

以下のような一次元配列にしたい

[2019/12/13, 2019/12/14, 2019/12/15, 2019/12/16, 2019/12/17, 2019/12/18, 2019/12/19, 2019/12/20, 2019/12/21, 2019/12/22, 2019/12/23, 2019/12/24]



コード.gs
function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var resultArray = [];
  var range = sheet.getRange(2, 1, lastRow, 1);
  var values = range.getDisplayValues();
  values = arrayPushApply(values);
  Logger.log(values);
}

//二次元配列を一次元配列にして返す
function arrayPushApply(array){
  for(var i = 1; i < array.length; i++){
    Array.prototype.push.apply(array[0], array[i]);
  }
  return array[0]
}



A列の値を5行ずつ実行してみる

コード.gs
function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var resultArray = [];
  var startRow = 2;
  var numRow = 5;
  var iterate = Math.round(lastRow / numRow) + 1;
  Logger.log(iterate)
  for(var i = 0; i < iterate; i++) {
    var range = sheet.getRange(startRow, 1, numRow, 1);
    var values = range.getDisplayValues();
    values = arrayPushApply(values);
    values = values.filter(function(value) { return value !== ''; });

    if(values.length > 0) {
      resultArray.push(values)
      startRow =  startRow + numRow;
    }
  }

  resultArray = arrayPushApply(resultArray);
  Logger.log(resultArray);
}

//二次元配列を一次元配列にして返す
function arrayPushApply(array){
  for(var i = 1; i < array.length; i++){
    Array.prototype.push.apply(array[0], array[i]);
  }
  return array[0]
}


A列の値を5行ずつを2回実行して
次回実行時は12行目から実行したい

スクリプトのプロパティにstartRowというプロパティを作って初期値2をセットしておく
実行する度にstartRowにnumRowsの値が足されて
最終行よりも大きくなると初期値の2に戻す

処理が重くて一度で終わらない場合(6分またはG suiteの場合30分が実行の上限)
複数回に分けて実行できるようにしたいので、
スクリプトのプロパティを利用して以下のようなコードで実現しました。


コード.gs
function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var resultArray = [];
  
  var numRow = 5;
  var iterate = 2;

  for(var i = 0; i < iterate; i++) {
    var startRow = getProp('startRow');
    var range = sheet.getRange(startRow, 1, numRow, 1);
    var values = range.getDisplayValues();
    values = arrayPushApply(values);
    values = values.filter(function(value) { return value !== ''; });

    if(values.length > 0) {
      resultArray.push(values)
      setProp('startRow', parseInt(startRow) + numRow);
    } else {
      setProp('startRow', 2);
    }
  }
  
  resultArray = arrayPushApply(resultArray);
  Logger.log(resultArray);
}

//二次元配列を一次元配列にして返す
function arrayPushApply(array){
  for(var i = 1; i < array.length; i++){
    Array.prototype.push.apply(array[0], array[i]);
  }
  return array[0]
}

function getProp(key) {
  return PropertiesService.getScriptProperties().getProperty(key);
}

function setProp(key, value) {
  PropertiesService.getScriptProperties().setProperty(key, value);
}



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 に課題が上がっていることが...