Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

GASでGoogle Docファイルを開いた場合をトリガーにする

GASではDocファイル開放をトリガーにすることもできます。

実際のところ

ファイル自身がひらかれたとき

ScriptApp.newTrigger('myFunction')
  .forDocument(DocumentApp.getActiveDocument())
  .onOpen()
  .create();

keyでの起動も可能。
別のファイルが開かれた場合にもあれこれできるみたい……管理者大歓喜??

ScriptApp.newTrigger('myFunction')
  .forDocument('1234567890abcdefghijklmnopqrstuvwxyz')
  .onOpen()
  .create();

GASスクリプトを指定時刻に実行する

GASは時刻や日時をトリガーにして実行させる方法があるのですが、
この設定はスクリプトで任意に実行可能です。
CRONみたいな使い方ができますね。

実際のところ

関数実行日の23時48分にお手製のmyFunction関数を実行する例は以下の通り。

function setTrigger(){
  var setTime = new Date();
  setTime.setHours(23);
  setTime.setMinutes(48); 
  ScriptApp.newTrigger('myFunction').timeBased().at(setTime).create();
}

トリガーをみると、本日の23:48にトリガーが設定されている事がわかります。
f:id:shuzo_kino:20180730235020p:plain

【読書メモ】プログラマの数学

プログラマの数学

プログラマの数学

数学ガールなどで有名な結城浩先生による、プログラマが使う数学的知識の読み物本です。

論理に帰納、繰り返しに再帰……と情報工学の人なら大体抑えているであろう内容ですが、
私自身は電子工学系の出身のため何んとな~く使っているものをちゃんと解説してくれる親切な本です。
独学でいろいろ身に着けた私のようなタイプの人には学びがあっていいかと思います。

私がもってるのは冒頭に掲示した初版ですが、第二版も出たそうです。

プログラマの数学第2版

プログラマの数学第2版

【読書メモ】「苦手な顧客」とどう向き合えばいいのか

「苦手な顧客」とどう向き合えばいいのか (「感情労働営業」スキルを高める方法)

「苦手な顧客」とどう向き合えばいいのか (「感情労働営業」スキルを高める方法)

感情労働」というコトバがあります。
新語の類のため辞書の掲載が見つからなかったのですが、
Wikipediaの記述を引用すると以下のように定義されているようです。

感情労働(かんじょうろうどう、英: Emotional labor)とは、感情が労働内容の不可欠な要素であり、かつ適切・不適切な感情がルール化されている労働のこと[1]。肉体や頭脳だけでなく「感情の抑制や鈍麻、緊張、忍耐などが絶対的に必要」である労働を意味する。
[1]:『別冊サンガジャパン 3』 サンガ、2016年12月が元

この本は感情労働の中でも特に「営業」について注目し、
それらについて上手い対処法や考え方を紹介してくれている本となっています。

第三章の副題「感情の見える化が”演技”である」というフレーズに、本書の基本的考え方が示されているかと思います。

紹介されている方法論も、変に精神論にも技術論にも寄せていないところが個人的に取っ付きやすかったですね。

正直なところ、まだ肚の底では芝居をしろというアドバイスが上手く納得できていないのですが、今の私に間違いなく必要な事であるのは理解ができました。
食わず嫌いで終わらせず、できるトコからやってきます。

GASでZIP圧縮

Google Apps Script上ではZIP圧縮も可能です。
ファイル数が多くて面倒な時なんかは重宝しそうですね。

実際のところ

zip圧縮関数にはBlob形式のものを配列として渡してやればよいです。

  /* blob作成。ここは各々方のお好みで */
  var YOURDOMAIN = "YOURDOMAIN";
  var nowDate = Utilities.formatDate(new Date(), 'JST', 'yyyyMMdd');
  var doctype = "docx"; //pdf,docx,odt,txt
  var filename = nowDate + "." + doctype
  
  var fetchUrl = "https://docs.google.com/a/" + YOURDOMAIN + "/document/export?format=docx&id=" + docid;
  var newfile = UrlFetchApp.fetch(fetchUrl,fetchOpt).getBlob().setName(filename);

  /* zip圧縮。Blob配列の形式でわたす */
  var zipfile = Utilities.zip([newfile]);

解凍用のunzip関数もあります

  var unzipfiles = Utilities.unzip(zipfile);

Google Apps Scriptの文字列フォーマット系関数

Google Apps Scriptにも文字列フォーマットの関数が用意されています。

実際の所

文字列を成型する場合はfomatString関数です。
構文はおなじみのsprintf。
Utilitiesの関数のため、書き方文字列自体は長くなってしまいますが……。

  //同じ意味
  var filename = nowDate + "." + doctype

  var filename = Utilities.formatString("%s.%s",nowDate,doctype);
  //同じ意味
  var fetchUrl = "https://docs.google.com/a/" + YOURDOMAIN + "/document/export?format=docx&id=" + docid;

  var fetchUrl = Utilities.formatString("https://docs.google.com/a/%s/document/export?format=docx&id=%s", YOURDOMAIN, docid); 


時刻用のformatDate関数というのもあります。
記法はJavasimpleDateFormatにならっています。

  var nowDate = Utilities.formatDate(new Date(), 'JST', 'yyyyMMdd');

Google DocsをPDFとWordにして出力しメールに添付する

Google DocsをPDFとWordにして出力しメールに添付する

実際のところ

function myFunction() {
  //いまのドキュメントを読み込む
  var doc = DocumentApp.getActiveDocument();
  var docid = DocumentApp.getActiveDocument().getId();
  var file = DriveApp.getFileById(docid);

  var mailaddr = Session.getActiveUser().getEmail();
  
  //認証トークン
  var fetchOpt = {
    "headers" : { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },
    "muteHttpExceptions" : true
  };
  
  //ファイル名まわり
  var YOURDOMAIN = "YOURDOMAIN";
  var nowDate = Utilities.formatDate(new Date(), 'JST', 'yyyyMMdd');
  var doctype = "docx"; //pdf,docx,odt,txt
  var filename = nowDate + "." + doctype
  
  var fetchUrl = "https://docs.google.com/a/" + YOURDOMAIN + "/document/export?format=docx&id=" + docid;
  var newfile = UrlFetchApp.fetch(fetchUrl,fetchOpt).getBlob().setName(filename);
  
    
  MailApp.sendEmail(mailaddr, 'メールサンプル', 'サンプルファイルつき.', {
    name: 'Automatic Emailer Script',
    attachments: [file.getAs(MimeType.PDF),newfile]
  });
}