GASでよく使うスプレッドシート操作まとめ

社内の業務効率化にお役立ちのGAS。
社内でちょっとしたお困りごとを相談される際によく使う内容をまとめました。

# PDF関連

### スプレッドシート内の特定のシートをPDF化して保存したい
```javascript:createPdf
const folderId = ""; //保存したいフォルダーのId
const ssId = ""; //スプレッドシートのId
const shId = ""; //保存したいシートのId
const fileName = ""; //保存するファイル名

//下記コードでアクティブなスプレッドシートから取得もできる
//const ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
//const shId = SpreadsheetApp.openById(ssId).getActiveSheet();

createPdf(folderId, ssId, shId, fileName);

function createPdf(folderId, ssId, shId, fileName){

  let baseUrl = "https://docs.google.com/spreadsheets/d/"
                + ssId
                + "/export?exportFormat=pdf&gid="
                + shId;
  
  let pdfOptions =  "&size=A4" //用紙サイズ (A4)
                + "&portrait=true"  //用紙の向き true: 縦向き / false: 横向き
                + "&fitw=true"  //ページ幅を用紙にフィットさせるか true: フィットさせる / false: 原寸大
                + "&top_margin=0.50" //上の余白
                + "&right_margin=0.20" //右の余白
                + "&bottom_margin=0.00" //下の余白
                + "&left_margin=0.20" //左の余白
                + "&horizontal_alignment=CENTER" //水平方向の位置
                + "&vertical_alignment=TOP" //垂直方向の位置
                + "&printtitle=false" //スプレッドシート名の表示有無
                + "&sheetnames=false" //シート名の表示有無
                + "&gridlines=false" //グリッドラインの表示有無
                + "&fzr=false" //固定行の表示有無
                + "&fzc=false" //固定列の表示有無;
  
  let url = baseUrl + pdfOptions;

  let token = ScriptApp.getOAuthToken();

  let options = {
    headers:{
      'Authorization':'Bearer ' + token
    }
  }

  let blob = UrlFetchApp.fetch(url, options).getBlob().setName(fileName);
  let folder = DriveApp.getFolderById(folderId);
}
```
:::note info
1枚のシートをPDF化したいだけなのに、なぜかPDF化すると空白のペーパーが挟まって2枚のファイルになってしまう、という場合はスプレッドシート側で不要なセルを全て削除して、オプションで余白を調整する
:::
:::note warn
let options部のheader内'Bearer 'は、末尾に半角スペースがひとつ入っているので注意！写経して勉強している方は見落としがち
:::

### PDFを結合したい
特定のフォルダ内にあるPDFファイルを全て結合して新しいファイルを作成する。
```javascript:mergePdf
function mergePdf(){
  const folderId = ""; //結合したいPDFを保存しているフォルダ名

  let folder = DriveApp.getFolderById(folderId);
  let itemList = folder.getFiles();
  
  let mergeList = [];
  let pattern = /.*\.pdf$/; //pdfファイルのパターン

  while(itemList.hasNext()){ //pdfファイルのみ抽出
    let file = itemList.next();
    if(pattern.test(file.getName())){
      pdfList.publish(file);
    }
  }

mergeFile = mergePdfs(folder, "filename", pdfList);
}

```

# シート内操作関連
### スプレッドシート内のシートをシート名で検索したい
```javascript:findSheetByName
const ssId = "" ;//スプレッドシートのファイルID
const sheetName = "" ;//検索したいシート名

function findSheetByName(ssId, sheetName){
  let ss = SPreadsheetApp.openById(ssId);
  let sheets = ss.getSheets(); //ファイル内のシートを取得
  
  for(var i = 0; i < sheets.length; i++){
    let sheet = sheets[i];
    if(sheet.getName()==sheetName){
      return sheet;
    }
  }
  return null;
}
```
:::note info
該当するシートがあれば、そのシート名が返される。
なければ、nullが返ってくる。
:::

### シート内の全角英数字を半角英数字に変換
:::note info
例えばgoogleフォームなどと連携しているスプレッドシートで、回答の前半角を揃えたいときに使用する。（最新の最終行のみ修正する想定ですが、行全体でループを回せばシート全体に反映することも可能です。）
:::

```javascript:convertCharacters
//ssId にスプレッドシートidを入れる
function convertCharacters(ssId) {
  const ss = SpreadsheetApp.openById(ssId);
  const sheet = ss.getActiveSheet();
  const lastRow = sheet.getLastRow(); //最終行を取得
  const lastColumn = sheet.getLastColumn(); //右端の列を取得

  function zentoHan(str){
    return str.replace(/[Ａ-Ｚａ-ｚ０-９]/g,function(s){
      return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
    })
  }
//for (let j = 1; j<=lastRow; j++{ //全行で変換したい場
  for (let i = 1; i<=lastColumn; i++ ){ 
    const cell = sheet.getRange(lastRow, i) //sheet.getRange(j, i)でシート全体
    const cellValue = cell.getValue();
    if(typeof cellValue === 'string'){ //String型の場合のみ変換する
      const convertedValue = zentoHan(cellValue.replace(/\n/g, "\n"));
      cell.setValue(convertedValue);
    }
  }

}
```


# 日時取得関連
### 日付を取得する
```javascript:getTodayDateComponents
function getTodayDateComponents() {
  var today = new Date();
  var year = today.getFullYear(); // 年を取得
  var month = today.getMonth() + 1; // 月を取得（getMonth()は0から始まるため+1する）
  var day = today.getDate(); // 日を取得

  return {
    year: year,
    month: month,
    day: day
  };
}

```
:::note info
日時データを、年、月、日にわけてそれぞれ取得する。getMonth()は0~11の値を返すので、+1して当該月の数値を取得する。
:::