【GAS】Googleドキュメントにスプレッドシートのデータを表示文字列通りで差し込む

応用

GAS応用の一覧

ご訪問ありがとうございます。

Googleシートマスターのひろしです。

前回

【GASスクリプト解説】 Googleドキュメントにスプレッドシートからデータを差し込む
  • GoogleスプレッドシートからGoogleドキュメントに埋め込むGASの詳細がわかります。
  • ループを使った項目の読み込み方がわかります。
  • 今回は、とっても価値の高い方法をお伝えします。


    これを知ることであなたは、

    • GASでスプレッドシートから日付取得時に変換する方法がわかります。
    • スプレッドシートの表示と同じ文字列を取得できるようになります。
    • GASの変更方法がわかります。

    なので、サクッとマスターして

    と答えてあげてください。

     

    ご質問

     

    お世話になります。プログラムはほぼ未経験です。
    
    差し込み印刷をGoogle上で実現したかったので、とても参考になりました!ありがとうございます。
    領収書を作ろうとしているのですが、いい線まで来たのですが、Word差し込みでも苦戦した、日付・金額の書式設定のところで躓いています。
    日付:Tue Mar 07 2023 00:00:00 GMT+0900 (日本標準時) → 2023年3月7日 としたい
    金額:千の位の,が記載できない
    
    Wordでいうといころの差し込み印刷のフィールド表示形式のようなものはあるのでしょうか?
    文字列を置換するときの
    basebody.replaceText('{' + items[i] + '}', setdata[i])
    で、書式も指定するのかな、と思いましたが、入っている情報は日付や金額以外に文字列等もあるので、その区別もどこかでしないと書式指定もできないような、、。
    
    
    日付の表示形式(年、月、日、曜日)を自由に設定する方法
  • 日付の表示形式の書式を自由に設定できるようになります。
  • こちらでご紹介いただいている指定が、このGASの中でも実現できれば良いなと思うのですが、、。 もしすでにどこかで解説いただいているなら、ご教示いただければ幸いです。 どうぞよろしくお願いいたします。

     

    やりたいこと

    差込時に

    日付:Tue Mar 07 2023 00:00:00 GMT+0900 (日本標準時) → 2023年3月7日 としたい

    金額:千の位の,が記載できない

     

    動画はこちら

    【GAS】Googleドキュメントにスプレッドシートのデータを表示文字列通りで差し込む

    シートはこちらから

    【コピペでできる】 GoogleドキュメントにGスプレッドシートからデータを差し込む
  • Googleドキュメントの定型文にGoogleスプレッドシートのデータを差し込むことができます。
  • GASがなんのことかわからなくてもコピペで簡単にできます。
  • さらに自分用に簡単にカスタマイズできます。
  •  

     

    ポイント

    日付の変換方法
    formatDate()を使用することで表示形式を変更できます。
    Utilities.formatDate(date, timeZone, format)
    例)
    Utilities.formatDate(new Date(), ‘JST’, ‘yyyy年MM月dd日’);
    2024年6月15日

    指定文字 時刻要素
    y
    M
    d
    E 曜日
    H
    時 (0-23) 24時制
    h
    時 (1-12) 12時制
    a AM/PM
    m
    s
    S ms
    z
    タイムゾーン (+nnnn)

     

    とはいえ
    getDisplayValues()を使用すれば、表示している文字列を取得できるので

    getValues()をgetDisplayValues()に置き換えればOKです。

     

    スクリプト

    const SH_NAME = "一覧"  //読み込みシート名
    const SH_NAME_SETTING = "設定"  //設定シート名
    const STS_END = "作成済み"
    
    
    const ID_STATUS = 0  //ステータス
    const ID_URL = 1  //URL
    
    
    
    
    /**
     * メニューの追加
     */
    function onOpen() {  //シート読み込み時に実行
      const customMenu = SpreadsheetApp.getUi()
      customMenu.createMenu('メニュー')     //メニューバーに表示するメニュー名
        .addItem('ドキュメントの出力', 'MakeDocFromTemplate') //メニューアイテム
        .addToUi()
    }
    
    
    /**
     * テンプレートをコピーしスプレッドシートの単語に置換する
     */
    function MakeDocFromTemplate() {
    
    
      const shenv = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SH_NAME_SETTING)
    
    
      const BASE_URI = shenv.getRange("B2").getValue()
      const DEST_FOLDER = shenv.getRange("B4").getValue()
    
    
      const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SH_NAME)
    
    
      //元となるファイルを取得
      const basefile = DriveApp.getFileById(BASE_URI)
    
    
      //コピー先のフォルダ
      const destfolder = DriveApp.getFolderById(DEST_FOLDER)
    
    
      const values = sh.getDataRange().getDisplayValues()
    
    
      let setdata = []    //ステータスとURL用のバッファ
    
    
      for (i = 1; i < values.length; i++) {
        console.log(values[i][0])
        if (values[i][0] != STS_END) {
          setDocdata(values[0], values[i], basefile, destfolder)
          // console.log(values[i][ID_URL])
        }
        setdata.push([STS_END, values[i][ID_URL]])  //バッファに要素を追加する
      }
      // console.log(setdata)
      sh.getRange(2, ID_STATUS + 1, values.length - 1, 2).setValues(setdata)
    }
    
    
    /**
     * テンプレファイルをコピーし
     * コピーしたドキュメント内の文字列を置換する
     * items      項目の要素
     * setdata    置換する文字列群
     * bfile      テンプレファイル
     * dfolder    コピー先
     */
    function setDocdata(items, setdata, bfile, dfolder) {
    
    
      // console.log("items=", items)
      // console.log("setdata=", setdata)
    
    
      //新しいファイル名
      console.log(setdata[ID_URL + 1])
    
    
      const newfile = bfile.makeCopy(setdata[ID_URL + 1], dfolder)
    
    
      const newid = newfile.getId()
      const newurl = newfile.getUrl()
    
    
      const basedoc = DocumentApp.openById(newid)
    
    
      const basebody = basedoc.getBody()
    
    
      //各項目の文字列を置換する
      for (let i = ID_URL + 1; i < items.length; i++) {
        // console.log('{' + items[i] + '}', setdata[i])
        basebody.replaceText('{' + items[i] + '}', setdata[i])
      }
      setdata[ID_URL] = newurl //新しいURL
    
    
    }

     

    前回からの変更箇所
    • 47行目

    const values = sh.getDataRange().getValues()

    const values = sh.getDataRange().getDisplayValues()

    に変更

    • 55,58行目

    if (values[i][0] != STS_END) {
    }

    を追加し「作成済み」の場合は、新たに作成しないよう修正。

     

    最後までご覧いただきありがとうございます。

    つぎはこちら

     

    【GAS】名前付き範囲を取得してGスプレッドシートからGoogleフォームのプルダウンに追加する
  • GASで名前付き範囲の取得ができます。
  • GASでGoogleフォームに名前付き範囲の項目を追加することができます。
  • GASでプルダウン、ラジオボタン、リストボックスの項目も追加できます。
  • GAS応用の一覧

    コメント

    タイトルとURLをコピーしました