ご訪問ありがとうございます。
Googleシートマスターのひろしです。
前回
【GASスクリプト解説】 Googleドキュメントにスプレッドシートからデータを差し込む
今回は、とっても価値の高い方法をお伝えします。
これを知ることであなたは、
- 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日 としたい
金額:千の位の,が記載できない
動画はこちら
シートはこちらから
【コピペでできる】 GoogleドキュメントにGスプレッドシートからデータを差し込む
ポイント
日付の変換方法
formatDate()を使用することで表示形式を変更できます。
Utilities.formatDate(date, timeZone, format)
例)
Utilities.formatDate(new Date(), ‘JST’, ‘yyyy年MM月dd日’);
→2024年11月21日
指定文字 | 時刻要素 |
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フォームのプルダウンに追加する