【GAS】Google Apps Script 活用事例 自作ライブラリを公開しました
自作ライブラリを作成しました。
実務でたくさんGASを書く中で、この処理をもっと簡単に書けたら、前にも似た処理を書いたなと痛感するシーンがあり、作成に踏み切りました。
スクリプトID
18rg2maFYXNmPmB2R-8s3UuFG850j5OLw4WBvcOrghzRMlfVbQWDgOVvZ
手順
Google Apps Scriptのエディタ(IDE)を開く
画面左のプラスマークにカーソルを当てて、ライブラリを追加クリック
スクリプトIDを入力し、検索ボタンを押す
最後に追加ボタンを押す
スクリプトの詳細について
使える関数一覧(スプレッドシート)
App Sheet
上記のスプレッドシートを元に作成されたWebアプリです。
リンクはこちら
Git Hub
01. getSheetByUrl
SheetオブジェクトをURL経由で取得します。シート名の変更によるエラーを防ぐスクリプトです。
const url = 'https://docs.google.com/spreadsheets/d/*************';
const sheet = nepia_infinity.getSheetByUrl(url);
02. getRange
console.log(`取得範囲: ${range.getA1Notation()}`); を書くのが面倒なので書いたスクリプトです。
const url = 'https://docs.google.com/spreadsheets/d/*************';
const sheet = nepia_infinity.getSheetByUrl(url);
const info = {row: 2, column: 1}
const range = nepia_infinity.getRange(sheet, info);
03. getLastRowWithText
途中に空白行があると、getValue().filter(String)などを使用した時に最終行の判定がズレる事があり、その対処法を考える中で書き上げたスクリプトです。
const url = 'https://docs.google.com/spreadsheets/d/**********';
const values = nepia_infinity.getValues(url);
const lastRow = nepia_infinity.getLastRowWithText(values, 2);
04. generateArray
2次元配列から列、縦方向の値を1次元配列で取得するスクリプトです。
const url = 'https://docs.google.com/spreadsheets/d/*************';
const values = nepia_infinity.getValues(url);
const array = nepia_infinity.generateArray(values, 0);
05. formatDate
曜日と日付の変換できるスクリプトです。
const today = nepia_infinity.formatDate(new Date(), 'yyyy/MM/dd (E)');
06. extractText
正規表現を使用して、HTMLタグに囲まれた文字列の取得を簡易化したスクリプトです。
const string = 'Bing イメージクリエーター. Image Creator は、Microsoft Edge のサイドバーから直接 DALL-E を使用して AI 画像を生成するのに役立ちます。';
const result = nepia_infinity.extractText(string, /[A-Z].* /, /\..* /);
07. getActiveCell
シート名、行、列、値、セルなどをオブジェクトで取得するスクリプトです。トリガー(編集時)と併用すると便利です。
const activeSheet = SpreadsheetApp.getActiveSheet();
const activeCell = nepia_infinity.getActiveCell(activeSheeet);
if(activeCell.sheetName !== '処理対象のシート名' ){
console.log(`処理対象のシートではないので終了します`);
return
}else if(activeCell.column !== 2 || activeCell.row === 1){
console.log(`処理対象ではないため終了します`);
return
}else{
// 具体的な処理を実行する
}
08. getHeadersRow
セルの結合があったり、1行目がヘッダー行ではないケースで便利なスクリプトです。
const url = 'https://docs.google.com/spreadsheets/d/************';
const values = nepia_infinity.getValues(url);
const headerRow = nepia_infinity.getHeaderRow(values, '日曜日');
09. replaceHeadersValues
見出し行の名前を指定すると、オブジェクトに変換してくれるスクリプトです。下記のサンプルでは、values[i][header.url]のように書く事で列の挿入や削除があっても、意図した列を操作出来ます。
const url = 'https://docs.google.com/spreadsheets/d/**************';
const values = nepia_infinity.getValues(url);
const header = {
blogTitle: 'タイトル',
url: 'URL',
category: 'カテゴリー'
}
const headerIndex = nepia_infinity.replaceHeaderValues(values, 0, header);
10. generateHeadersIndex
見出し行が英語の場合のみ使用可能なスクリプトです。手間は一番掛かりません。
const url = 'https://docs.google.com/spreadsheets/d/************';
const values = nepia_infinity.getValues(url);
const headerIndex = nepia_infinity.generateHeaderIndex(values, 0);
11. showPrompt
入力画面を表示させるスクリプトです。
const prompt = nepia_infinity.showPrompt('入力画面', '(例) 野比のび太');
12. getValues
URLを指定するだけでシートの値を取得できるスクリプトです。
const url = 'https://docs.google.com/spreadsheets/d/*****************';
const values = nepia_infinity.getValues(url);
13. getFilteredValues
特定のキーワードを含む新たな2次元配列を作成します。
部分一致でも抽出できるので、使い勝手が良いスクリプトの一つです。
const url = 'https://docs.google.com/spreadsheets/d/****************';
const values = nepia_infinity.getValues(url);
const filtered = nepia_infinity.getFilteredValues(values, 'spreadsheet', 'Google');
Spreadsheetと、Googleそれぞれの単語を含む行を取得することが出来ました。
14. reduceObjectKeys
必要なオブジェクトのみを取得するスクリプトです。サンプルコードではidのみを抽出しています。
const values = [{id: 'jp123', name: 'nobita'}, {id: 'jp456', name: 'shizuka'}, {id: 'jp789', name: 'suneo'}];
const reduced = nepia_infinity.reduceObjectKeys(values, 'id');
15. showHtmlSentence
HTMLを表示してくれるスクリプトです。
const html = '<p>テスト</p>';
nepia_infinity.showHtmlSentence(html, 'HTMLを表示');
16. splice
Spliceメソッドを使いやすく?したスクリプトです。
nepia_infinity.splice(array, 0, 0, '静香'); //配列の0番目に値を追加
const newArray = nepia_infinity.splice(array, 0, 1, '静香'); //配列の0番目を置換
const newArray = nepia_infinity.splice(array, 0, 1); //配列の0番目を削除
17. generateDateStringValues
引数の指定日から指定日までの日付を生成してくれるスクリプトです。
const values = nepia_infinity.generateDateStringValues('2023/01/01');
18. convertDay
曜日に変換するスクリプトです。
const date = new Date();
const day = nepia_infinity.convertDay(date.getDay());
19. removeDuplicates
1次元配列から重複を省くだけスクリプトです。
const array = [1, 2, 2, 4, 5, 9, 8, 2, 3];
nepia_infinity.removeDuplicates(array);
Rangeクラスにも同様の名前のメソッドがあります。GUIから操作でコードを書くよりも早く出来るのと、元データを直接編集してしまうため、使い所を選ぶメソッドです。
20. createTextFinder
検索値がシートのどこにあるかを探し当ててくれるスクリプトです。必要に応じてスクリプトも併用するとGoodです!!
└ 54. sortInsideArray() 配列内のオブジェクトをsort
└ 14.reduceObjectKeys() 不要なオブジェクトを取り除く
const url = 'https://docs.google.com/spreadsheets/d/1JfPF1KQss6nMA4fHyGvNyAVnaE4zGG80aVx3qKhx4Ow/edit#gid=3542835';
nepia_infinity.createTextFinder(url, '安村', '名簿');
21. getCalAllEvents
指定したカレンダーの全ての予定を取得するスクリプトです。
実際には取得期間を限定したり、予定名が該当したものだけをシートに転記したいケースなどがほとんどだと思うため、使い勝手の良い関数を作ろうかなと考えています。
22. getDriveFiles
指定したGoogle Driveのフォルダ内のファイルを2次元配列で取得するスクリプトです。
const url = 'https://drive.google.com/drive/folders/*******';
nepia_infinity.getDriveFiles(url);
23. transferOwnership
オーサー権限を指定したメールアドレスのユーザーへ移譲するスクリプトです。
Google WorkSpaceではない個人アカウントでは、譲渡に失敗します。
24. grantEditPermissionToFolder
フォルダ内のファイル全てに編集権限を付与するスクリプトです。
25. selectColumns
2次元配列で返します。
別シートに必要なものだけ転記したいときに重宝します。
部分一致で取得したい場合は、13. getFilteredValues()
const url = 'https://docs.google.com/spreadsheets/d/*******';
const values = nepia_infinity.getValues(url);
nepia_infinity.selectColumns(values, {name: 0, url: 1});
26. getGmailThread
Gmailのスレッドを2次元配列で取得するスクリプトです。
const values = nepia_infinity.getGmailThread('スキしました!', 10);
//要らない情報を削除することもライブラリの関数を使って出来ます!!
const newValues = values.map(array => nepia_infinity.splice(array, 4, 1));
console.log(newValues);
27. createFolders
指定したフォルダに構造が同じ子フォルダを作成します。
└ 53. createMonthlyDataNames()
上記の関数を併用すると月次データを作るのが楽ちんになります。
const url = 'https://drive.google.com/drive/folders/******';
const array = ['給与明細_2023'];
const months = [
'1月', '2月', '3月', '4月', '5月', '6月',
'7月', '8月', '9月', '10月', '11月', '12月'
];
nepia_infinity.createFolders(url, array, months);
給与明細_2023 > 1月,2月…..みたいな感じでフォルダ作成されます。
28. setValues
確認した後で2次元配列を貼り付けるスクリプトです。
29. modifyStrings
文字列の置換を一括で行うスクリプトです。
例えばCtrl + Fで検索して置換したい文字が複数ある場合などにお勧めです。
30. convertValuesToObjects
2次元配列をオブジェクトに書き換えるスクリプトです。
ヘッダー行がkeyとなります。
const url = 'https://docs.google.com/spreadsheets/d/**************';
const values = nepia_infinity.getValues(url);
const object = nepia_infinity.convertValuesToObjects(values, 0);
スクリプトには、普段あまり使わないObject.fromEntries()を使用しています。
31. deleteEvents
引数に指定した予定を削除するスクリプトです。
32. registerEvents
シートの値から予定名、開始終了時刻、詳細欄などを取得して、カレンダーに登録するスクリプトです。
33. showEditEventsLauncher
カレンダーの予定を編集するスクリプトです。下記の4つのケースに合わせて編集することが出来ます。
34. generateNumbers
引数に指定した数値を生成するスクリプトです。
nepia_infinity.generateNumbers(1, 1000);
35. generateTwoByteRegex
全角英数字を半角英数字に変換するための置換リストを生成する関数です。
36. getRandomNumber
乱数で適当な数値を取り出すスクリプトです。
下記の例では、1000を最大値としたランダムな整数を出力します。
nepia_infinity.getRandomNumber(1000);
37. findLargestNumber
配列内で一番大きな値を取得するスクリプトです。
外れ値の検知とかに使えるかもしれません。
1次元配列を作成するときは、generateArray()をどうぞ。
const array = [323, 763, 166, 717, 232, 962, 413, 580, 848, 827, 118, 476, 754, 892, 928, 504, 632, 561, 793, 878];
nepia_infinity.findLargestNumber(array);
38. getLastName
スペースの前後から苗字を判定するスクリプトです。
スペースがない場合は、2文字を切り出します。鈴木、高橋、佐藤など大抵は2文字でイケるはず….。
const name = '竈門 炭治郎'
const lastName = nepia_infinity.getLastName(name);
39. convertCellPhoneNumber
CSVなどで展開したテキストからハイフンありの携帯番号に生成し直すスクリプトです。
const string = '8012345678';
nepia_infinity.getCellPhoneNumber(string);
40. getSlidesContents
Google Slidesの内容を2次元配列で取得するスクリプトです。
const url = 'https://docs.google.com/presentation/d/1GButmtqvj5LT8TzLexFRnA1-5tDsW5ft-S7E4_Sy8AE/edit#slide=id.gcb9a0b074_1_0';
const contents = nepia_infinity.getSlidesContents(url);
41. generateNameWithUrl
採用実務でよく使うことがある処理で、<p><a href="htttps…….">野比さん</a></p>のように、応募者の苗字にHRMOSなどのリンクを貼り共有したいときに便利です。
なお、こちらの個人情報は、ジェネレーターを利用したダミーデータです。
const url = 'https://docs.google.com/spreadsheets/d/*******';
const html = nepia_infinity.generateNameWithUrl(url, 0, {name: '氏名', url: 'URL'});
nepia_infinity.showHtmlSentence(html, 'HTMLを表示する');
Slackなどで共有も楽々です!!
42. convertSheetToPdf
スプレッドシートをPDF化して指定したフォルダに格納するスクリプトです。
43. convertDocToPdf
ドキュメントをPDF化して指定したフォルダに格納するスクリプトです。
const folderUrl = 'https://drive.google.com/drive/folders/*****';
nepia_infinity.convertDocToPdf();
44. getDocContents
ドキュメントの内容を文字列で取得するスクリプトです。
const url = 'https://docs.google.com/document/d/*******';
nepia_infinity.getDocContents(url);
45. getDocParagraphs
ドキュメントの内容をパラグラフ形式で取得するスクリプトです。
46. getMatchedTextsInParagraphs
特定のキーワードなどと一致した箇所を取得するスクリプトです。
const url = 'https://docs.google.com/document/d/**********';
const paragraphs = nepia_infinity.getDocParagraphs(url);
const values = nepia_infinity.getMatchedTextsInParagraphs(paragraphs, /.*死神.*/);
YOASOBIの夜に駆けるの元ネタ、タナトスの誘惑のテキストの中から死神の登場回数を検索しています。
47. getSpeakerNotes
Google Slidesのスピーカーノートを2次元配列で取得するスクリプトです。
const url = 'https://docs.google.com/presentation/d/**********/edit';
nepia_infinity.getSpeakerNotes(url);
48. getInfoByEventId
イベントIDから予定名、開始時刻、イベント詳細欄の記載内容を取得するスクリプトです。
const eventId = '**************';
nepia_infinity.getInfoByEventId(eventId);
49. convertToSingleColumn
このような表から取得した2次元配列を縦1列に変換する
const original = [
['品川', '大崎', '五反田', '目黒'],
['恵比寿', '渋谷', '原宿', '代々木'],
['新宿', '新大久保', '高田馬場', '目白'],
['池袋', '大塚', '巣鴨', '駒込'],
['田端', '西日暮里', '日暮里', '鶯谷'],
['上野', '御徒町', '秋葉原', '神田']
];
//成形し直した2次元配列を新しいシートに貼り付ける
const values = reformatWithAlternateValues_(original);
const newSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet();
newSheet.getRange(1, 1, values.length, values[0].length).setValues(values);
50. replaceStringWithSheetValue
テンプレートの文字列に表の値を差し込むスクリプトです。
const values = [["John", "https://example.com"],["Tim", "https://example2.com"]];
const template = "こんにちは、{name}さん。URLは{url}です。";
const targetArray = ["{name}", "{url}"];
nepia_infinity.replaceStringWithSheetValue(template, targetArray, values);
実務だと面談を複数設定する機会があるのですが、カレンダーの詳細欄に値を差し込むことに重宝しそうです。
51. renameAllFile
フォルダ内のファイルをリネームするスクリプトです。
const url = 'https://drive.google.com/drive/folders/******';
const values = [['2022', '2023']]; //['変換前', '変換後']
nepia_infinity.renameAllFile(url, values);
52. getFileNameWithUrl
Google Driveのフォルダ内のファイル一覧をHTMLで表示する
const url = 'https://drive.google.com/drive/folders/*******';
nepia_infinity.getFileNameWithUrl(url);
53. createMonthlyDataNames
月次データの連番を作成するスクリプトです。
generateSerialNumber('2023年', 12, '月');
54. sortInsideArray
配列内のオブジェクトを昇順で並び替えるスクリプトです。
const array = [
{ name: "tetsuya", age: 25 },
{ name: "hanako", age: 55 },
{ name: "tomokazu", age: 10 },
{ name: "minami", age: 28 }
];
// ageを昇順で並び替える
sortInsideArray(array, 'age');
55. findDataByQuery
スプレッドシートの2次元配列内のデータを検索し、一致した行かつ指定した列の情報を返します。
別のスプレッドシートから値を取得できるVLOOKUP関数みたいな感じです。
const url = 'https://docs.google.com/spreadsheets/d/***********';
const value = nepia_infinity.findDataByQuery(url, 0, 'JP6293', 1);
56. combineColumnToSingleCell
複数の列にまたがった情報を改行タグで一つのセルにまとめるスクリプトです。
const url = 'https://docs.google.com/spreadsheets/d/***********';
const values = nepia_infinity.combineColumnToSingleCell(url);
const newSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet();
newSheet.getRange(1, 1, values.length, values[0].length).setValues(values);
上記の表を1つのセルにまとめて、1列に直して欲しい。なかなか上手くいきませんでした。
57. convertSlidesToJpg
Google Slidesの全ページをjpgに変換する
プレゼンテーション名_01.jpgのように連番で出力
const url = 'https://drive.google.com/drive/folders/*********';
nepia_infinity.convertSlidesToJpg(url);
58. addImageToSheet
convertSlidesToJpg()を使用した後に、作成した画像を
セル内に挿入するスクリプト
const url = 'https://drive.google.com/drive/folders/*********';
nepia_infinity.addImageToSheet(url, 2, 3);
59. setRules
他のファイルから値を取得し、データ入力規則としてアクティブなシートに追加する
const url = 'https://docs.google.com/spreadsheets/d/******';
nepia_infinity.setRules(url, 1, 'A2:B');
60. rotateValues
2次元配列を回転させるスクリプト
const values = [["John", "https://example.com"],["Tim", "https://example2.com"]];
const rotated = nepia_infinity.rotateValues(values);
61. buildObjectFromPairs
対となる配列を用意して、空のオブジェクトにkey, valueを追加していくスクリプト
const keys = ['timeStamp', 'name', 'question'];
const array = ['タイムスタンプ', '名前', '質疑応答の満足度'];
const url = 'https://docs.google.com/spreadsheets/d/1JfPF1KQss6nMA4fHyGvNyAVnaE4zGG80aVx3qKhx4Ow/edit#gid=1004950262';
const headers = nepia_infinity.getValues(url)[0];
nepia_infinity.buildObjectFromPairs(headers, keys, array);
62. selectNewValues
新しい値かどうかをチェックして新しい2次元配列を作成する
const existingRecords = [['jp123', 'のび太', '人事部'], ['jp456', 'スネ夫', '総務部']];
const newValues = [['jp123', 'のび太', '人事部'], ['jp789', 'ジャイアン', '営業部']];
nepia_infinity.selectNewValues(existingRecords, newValues, 0);
63. modifyObject
getRange()メソッドで使うために、オブジェクトの値全てに1を足す。
{id: 0, name: 1, department: 2} => {id: 1, name: 2, department: 3}
let column = { id: 0, name: 1, address: 4 };
column = nepia_infinity.modifyObject(column);
64. duplicateReplacedTemplate
差込文書作成を効率化する関数
const month = new Date().getMonth() + 1;
console.log(`処理対象: ${month}月`);
const info = {
sheetUrl: 'https://docs.google.com/spreadsheets/d/*********/edit#gid=********',
fileName: `{id}_{name}_${month}月分_給与明細`, //差込文書のファイル名
keys: ['id', 'name', 'address'],
headerNames: ['ID', '氏名', '住所'],
templateFileUrl: 'https://docs.google.com/document/d/**********/edit',
folderUrl: 'https://drive.google.com/drive/folders/***********'
}
nepia_infinity.duplicateReplacedTemplate(info);
テンプレート(原本)を複製し、新しく作成した文書内の{id}をシートの値で置換します。
65. deleteSpecificSheets
const excludedSheetNames = ['シート1', '名簿', 'シート7'];
nepia_infinity.deleteSpecificSheets(excludedSheetNames);
66. generateMultipleSheets
const values = nepia_infinity.createMonthlyDataNames('売上', 12, '月分集計');
const array = values.flat();
console.log(array);
nepia_infinity.generateMultipleSheets(array);
67. swapWithAscendingIndex
オブジェクト内の値を昇順に並び替え、それに対応するインデックスで置換する
const object = {name: 1, step: 6, date: 4};
const newObject = swapWithAscendingIndex(object);
68. getItemCounts
配列内の指定された項目の出現回数を数える関数
ざっくり言うとCOUNTIFのような挙動をする関数
function test_getItemCounts(){
const array = ['とても満足', 'とても満足', 'やや不満', 'やや満足', '不満', 'やや満足', 'やや満足', 'とても満足', 'やや不満', 'どちらともいえない'];
const items = Array.from(new Set(array));
console.log(items);
getItemCounts(array, items);
}
69. getActiveSheetByUrl
01. getSheetByUrlの親戚で、URL経由でシートを取得します。getSheetByUrlでは、getSheets()を利用して、for文を回しsheetIdが一致したらシートオブジェクトを返すとしているので、少し時間が掛かってしまいます。
こちらは対照的に、activeSheetを利用しているため処理時間が若干短くなります。欠点としてアクティブなシートを利用するため、トリガー設置には不向きです。
70. convertSheetDataToQueryResults
71. splitAddressColumn
72. convertSheetDataToQueryResults
73. getheaderTitles
74. stepwiseVlookupColumnInsert
GASだと他のメンバーが理解できない事が多いので、VLOOKUP関数に頼るケースが時折あります。その際に、挿入される数式内の列を1ずつインクリメントしていきます。
const url = 'https://docs.google.com/spreadsheets/d/1JfPF1KQss6nMA4fHyGvNyAVnaE4zGG80aVx3qKhx4Ow/edit#gid=733712207';
const column = {
query : 'ID',
result: '氏名'
}
nepia_infinity.stepwiseVlookupColumnInsert(url, 0, column, 2);