個人的に使っているGoogleAppsScript Snippetsまとめ


最近、GASが楽しい。仕事捗るし、スクレイピングやAPI叩くみたいなこともできるし、cron的な事もできるし。
ということで自分が使っているScriptを上げていこうと思います。（随時更新）

##Sheetの全実データを配列取得

```Javascript
function myFunction() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var data = sheet.getDataRange().getValues();
  
  Logger.log(data);
}
```

##HTTPリクエスト

```Javascript
function myFunction() {
  var response = UrlFetchApp.fetch(url);
  //Bod抜き出しには
  var body = response.getContentText();

  Logger.log(body);
}
```

##行の重複チェック
```Javascript
function checkIds() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getDataRange().getValues();
  var last_row = sheet.getLastRow();
  var duplicate_id = "";
//  Logger.log(values);
  
  for(var i=2; i<=last_row; i++){
    for(var j=2; j<=last_row; j++){
      if(i==j) continue;
      if(values[i-1][0] == values[j-1][0]) {
        duplicate_id += "行" + i + "が重複しています。";
      }
    }
  }
  
  if("" != duplicate_id) SpreadsheetApp.getUi().alert(duplicate_id);
  
}
```

##セルの文字数チェック
トリガーをスプレッドシートの変更にいれてリアルタイムチェックが出来る。

```Javascript
function myFunction() {
  var cell = SpreadsheetApp.getActiveRange();
  Logger.log(cell.getValue());
  
  var val = cell.getValue();
  if(141 < val.length) {
    SpreadsheetApp.getUi().alert("文字数が超過しています。現在の文字数は" + val.length + "文字です。");
  }
}
```

##入力したセルのイベントを受け取り2倍にする
トリガーをセルの変更に

```Javascript
function double() {
  var range = SpreadsheetApp.getActiveRange();
  var value = range.getValue();
  Logger.log(value);
  
  range.setValue(value*2);
}
```

##HTMLパース

```Javascript
function htmlParse() {

var response = UrlFetchApp.fetch("http://en.wikipedia.org/wiki/Document_Object_Model");
var doc = XmlService.parse(response.getContentText()).getRootElement().getChild("head").getChild("title").getText();
Logger.log(doc);

}
```

##URL一覧からメタタグのdesctiptionの取得

```Javascript
function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var urlCol = 1;
  var startRow = 1;
  var lastRow = sheet.getLastRow();
  var reg = /<meta.*name\s*=\s*[\"|\']description[\"|\'].*content\s*=\s*[\"|\'].*?[\"|\'].*>/gi;
//  Logger.log(lastCol + "-" + lastRow);
  
  data = sheet.getRange(startRow,urlCol,lastRow);
  values = data.getValues();
  
  for(var i in values) {
    if("" == values[i] ) {
      continue;
    }
    
    var response = safeFetchUrl(values[i]);
    if(!response){
      continue;
    }
    
    var tag = response.getContentText().match(reg);
    if(null == tag) {
      continue;
    }
    
    var content = response.getContentText().match(reg)[0].replace(/(<meta.*content\s*=\")|(\".*>)/gi,"");
    var row = parseInt(i)+1;
    var range = sheet.getRange(row,urlCol+1);

    range.setValue(content);
  }
}

function double() {
  var range = SpreadsheetApp.getActiveRange();
  var value = range.getValue();
  Logger.log(value);
  
  range.setValue(value*2);
}

function safeFetchUrl(url) {
  var url = url;
  var response = UrlFetchApp.fetch(url, { muteHttpExceptions:true });
  if(response.getResponseCode() != 200) {
    Logger.log("This is dead link: " + url);
    return false;
  }
  
  return response;
}
```

##URLの死活チェック
```Javascript
function safeFetchUrl(url) {
  var url = url;
  var response = UrlFetchApp.fetch(url, { muteHttpExceptions:true });
  if(response.getResponseCode() != 200) {
    Logger.log("This is dead link: " + url);
    return false;
  }
  
  return response;
}
```