I share this blog with my thoughts and creations from my daily programming, knowledge, and technology updates.
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を知りたい
この記事ではキーとなる文字をダブルクオートで囲んでいるので
ダブルクオート自体をキーにする場合はシングルクオートで囲み直す
ダブルクオートを入力するとこうなる
ここだけこうしてやる
'"': 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.gsfunction 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列の開始行をスクリプトのプロパティを使って読み書きする方法を試しました
実行前
実行後
サンプルデータ
english | japanese |
candy | |
chocolate | |
gum | |
caramel | |
cake | |
cream puff | |
chips | |
pancake | |
biscuit | |
pudding | |
cookie |
コード4.gsfunction 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分ごとに実行されて、最終行まで実行したらトリガーが自動で削除される
一日に翻訳できる量には制限があります
その上限を越えるとその日はそれ以上実行できなくなります
実行前
実行後
サンプルデータ
english | japanese |
candy | |
chocolate | |
gum | |
caramel | |
cake | |
cream puff | |
chips | |
pancake | |
biscuit | |
pudding | |
cookie |
コード3.gsvar 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列に入力されている値の最終行を取得してその次の行から翻訳してみる
実行前
実行後
サンプルデータ
english | japanese |
candy | |
chocolate | |
gum | |
caramel | |
cake | |
cream puff | |
chips | |
pancake | |
biscuit | |
pudding | |
cookie |
コード2.gsvar 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列に入れたい
実行前
実行後
サンプルデータ
english | japanese |
candy | |
chocolate | |
gum | |
caramel | |
cake | |
cream puff | |
chips | |
pancake | |
biscuit | |
pudding | |
cookie |
最終行までを取得して、全部一気に翻訳してみる
コード1.gsvar 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!のメールで設定したのでその手順を書いていきます
- Yahoo! ドメイン側の設定
- 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ファイルに変換する
- フォルダをアプリにドラッグ&ドロップする
- フォルダ内のPDFファイルをJPEGに変換する
- 保存するフォルダを選択して保存する
- ファイル名の連番を4桁でつけ直す
アプリを作るステップ
STEP 1Finder > アプリケーション > Automator を開きます
STEP 2
「アプリケーション」を選択して「選択」をクリックします
STEP 3
「フォルダの内容を取得」をダブルクリックで右に追加します
STEP 4
「PDFページをイメージとしてレンダリング」をダブルクリックして右に追加します
フォーマットを「JPEGイメージ」に設定します
STEP 5
「Finder項目をコピー」をダブルクリックして右に追加します
「オプション」をクリックして
「ワークフローの実行前にこのアクションを表示」をチェックします
STEP 6
「Finder項目の名前を変更」をダブルクリックして右に追加する
「連番付きの名前にする」を設定する
「すべての番号を」「4」桁にする
STEP 7
ファイル > 保存 を選択する
STEP 8
名前を決めて「保存」する
実行方法
- Finder > 書類 を開くと作成した「PDFtoJPEG」アプリが保存されています
- このアプリにPDFファイルが入ったフォルダをドラッグ&ドロップします
- しばらくすると保存先を聞かれるので指定します
- しばらくすると指定した保存先に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> |
関連記事
HtmlServiceでviewportを使いたい
参考
TouchEvent.changedTouches
https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/changedTouches
HtmlServiceでviewportを使いたい
参考
TouchEvent.changedTouches
https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent/changedTouches
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を返す
コード.gsfunction 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行ずつ実行してみる
コード.gsfunction 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分が実行の上限)
複数回に分けて実行できるようにしたいので、
スクリプトのプロパティを利用して以下のようなコードで実現しました。
コード.gsfunction 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 に課題が上がっていることが...