しるてく

技術的な話をします

Google Form送信時に情報をslackに通知をする

そういう機能が欲しかったのでGAS書いた。

手順

1. フォームを作る

適当に好きなフォームを作る。

2. スクリプトエディタからGASを書く

f:id:ofsilvers:20170816141110p:plain:w250

画面右上のメニューから選択する。

3. スクリプト書く

function onFormSubmit(e) {
  sendToSlack(e);
}

function sendToSlack(e) {
  var token = 'FIXME'; // your token
  var channel = 'FIXME'; // e.g. '#random'
  var username = 'FIXME';
  var icon_emoji = 'FIXME'; // e.g. ':beer:'
  
  var payload = {
      'token' : token,
      'channel' : channel,
      'text' : createText(e),
      'username' : username,
      'parse' : 'full',
      'icon_emoji' : icon_emoji
  };

  var params = {
      'method' : 'post',
      'payload' : payload
  };

  var response = UrlFetchApp.fetch('https://slack.com/api/chat.postMessage', params);
}

function createText(e) {
  return '適当なメッセージ';
}

4. トリガを設定する

f:id:ofsilvers:20170816141743p:plain

スクリプトエディタの時計みたいなところから以下のような感じでトリガを設定する。

f:id:ofsilvers:20170816141827p:plain

投稿内容の取得例

Class FormResponse  |  Apps Script  |  Google Developers

投稿した人

  var mail = e.response.getRespondentEmail();
  var user = mail.split('@')[0];

もし会社とかでドメインが一緒なら@以前がおそらく社員の名前。

投稿内容

  var res = e.response.getItemResponses();
  var target = res[0].getResponse(); // 1個目の質問の回答
  var comment = res[1].getResponse(); // 2個目の質問の回答

crontabでdateを扱うときとかに注意すること

45  9 * * 3 hoge.pl `date -v+2d +"%Y%m%d"`

こんな感じのことやろうとしたら

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file

こけてなんだろなーと思ったらcrontabでは % 以降を標準入力として扱うらしくエスケープが必要らしい。

みんながハマった道だと思いつつメモ残しておく。

Androidのパッケージ名に使える文字

AppStoreとあわせようとしてハマったのでメモ。

基本は英字。 先頭でなければ 数字と_が使える。

https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/content/pm/PackageParser.java#1201

    private static String validateName(String name, boolean requireSeparator,
            boolean requireFilename) {
        final int N = name.length();
        boolean hasSep = false;
        boolean front = true;
        for (int i=0; i<N; i++) {
            final char c = name.charAt(i);
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
                front = false;
                continue;
            }
            if (!front) {
                if ((c >= '0' && c <= '9') || c == '_') {
                    continue;
                }
            }
            if (c == '.') {
                hasSep = true;
                front = true;
                continue;
            }
            return "bad character '" + c + "'";
        }
        if (requireFilename && !FileUtils.isValidExtFilename(name)) {
            return "Invalid filename";
        }
        return hasSep || !requireSeparator
                ? null : "must have at least one '.' separator";
    }

macで半角ダッシュ(--)が全角ダッシュ(―)に変換されてしまう呪いを解く

carton install --deployment 打ってくださいみたいな発言で、半角ダッシュが全角になってて、「なんかおかしいんですけど…」みたいになることが社内で頻発してて、なぜかslackのせいにされてるけど、それmacの設定だよ!!

システム環境設定 > キーボード > ユーザ辞書 から、「スマート引用符とスマートダッシュを使用」をOFFにしましょう!

f:id:ofsilvers:20151130105852p:plain

UIWebView の謎のボーダーと白い背景

UIWebView配置したら、バウンスしたときの背景が白かったり、WevViewの下に黒い下線が表示されたりしてなんだろって思ったら、WebView の  opaquefalse にして、Background を ClearColor にすれば良いだけだった。

ちなみにバウンスもさせたくないよって場合は webView.scrollView.bounces = false してあげればよい。

android で INSTALL_FAILED_UID_CHANGED が出たら

諦めて出荷時に戻しましょう!

UICollectionViewでSDWebImage使うと同じ画像が表示されてしまうことがある

CollectionViewで図鑑(所持していると画像が見えて、所持していないと?画像が表示される)みたいなのを作るとして、

class HogeCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var hogeImageView: UIImageView!

    func setImage(url: String?) {
        if url != nil {
            self.hogeImageView.sd_setImageWithURL(NSURL(string: url))
        } else {
            self.hogeImageView.image = UIImage(named: "empty_hoge")
        }
    }
}

こんな感じのカスタムセルを作って、 cell.setImage(url) みたいな感じで画像をセットすると、未所持セルで何故か他の所持セルと同じ画像が表示されてしまう。

どうやら動きをみると、画面外にスクロールすると、どんどん未所持セルが所持セルに置き換わっているようなので、cellのreuseでsdWebImageが悪さしているらしいことが分かる。

なので、以下のように、 prepareForReusesd_cancelCurrentImageLoad を呼んであげればよさそうだ。

class HogeCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var hogeImageView: UIImageView!

    override func prepareForReuse() {
        super.prepareForReuse()
        self.hogeImageView.sd_cancelCurrentImageLoad()
    }

    func setImage(url: String?) {
        if url != nil {
            self.hogeImageView.sd_setImageWithURL(NSURL(string: url))
        } else {
            self.hogeImageView.image = UIImage(named: "empty_hoge")
        }
    }
}

なおった。