diff --git a/document/PVC.one b/document/PVC.one index 3fc4009..ebacb4b 100644 Binary files a/document/PVC.one and b/document/PVC.one differ diff --git a/document/①仕様書_園児別出欠簿入力_20250321.xlsx b/document/①仕様書_園児別出欠簿入力_20250321.xlsx new file mode 100644 index 0000000..776f59e Binary files /dev/null and b/document/①仕様書_園児別出欠簿入力_20250321.xlsx differ diff --git a/document/①仕様書_園児別出欠簿入力_20250402.xlsx b/document/①仕様書_園児別出欠簿入力_20250402.xlsx new file mode 100644 index 0000000..0e3a4bb Binary files /dev/null and b/document/①仕様書_園児別出欠簿入力_20250402.xlsx differ diff --git a/document/⑤仕様書_学年別保育計画_20250214.xlsx b/document/⑤仕様書_学年別保育計画_20250214.xlsx new file mode 100644 index 0000000..0828e55 Binary files /dev/null and b/document/⑤仕様書_学年別保育計画_20250214.xlsx differ diff --git a/document/⑥仕様書_保育計画月案_20250214.xlsx b/document/⑥仕様書_保育計画月案_20250214.xlsx new file mode 100644 index 0000000..91c392c Binary files /dev/null and b/document/⑥仕様書_保育計画月案_20250214.xlsx differ diff --git a/document/⑦仕様書_保育計画週案_20250214.xlsx b/document/⑦仕様書_保育計画週案_20250214.xlsx new file mode 100644 index 0000000..70ab6ad Binary files /dev/null and b/document/⑦仕様書_保育計画週案_20250214.xlsx differ diff --git a/document/⑧仕様書_学期反省・評価_20250214.xlsx b/document/⑧仕様書_学期反省・評価_20250214.xlsx new file mode 100644 index 0000000..b64d374 Binary files /dev/null and b/document/⑧仕様書_学期反省・評価_20250214.xlsx differ diff --git a/document/横山台こども園様_帳票テンプレート(Excel作成分)/ゆり・つき1視診表.xlsx b/document/横山台こども園様_帳票テンプレート(Excel作成分)/ゆり・つき1視診表.xlsx index 160bfb6..d04d072 100644 Binary files a/document/横山台こども園様_帳票テンプレート(Excel作成分)/ゆり・つき1視診表.xlsx and b/document/横山台こども園様_帳票テンプレート(Excel作成分)/ゆり・つき1視診表.xlsx differ diff --git a/document/横山台こども園様_帳票テンプレート(Excel作成分)/個別配慮.xlsx b/document/横山台こども園様_帳票テンプレート(Excel作成分)/個別配慮.xlsx index 48a019d..2671aec 100644 Binary files a/document/横山台こども園様_帳票テンプレート(Excel作成分)/個別配慮.xlsx and b/document/横山台こども園様_帳票テンプレート(Excel作成分)/個別配慮.xlsx differ diff --git a/document/横山台こども園様_帳票テンプレート(Excel作成分)/出欠集計表.xlsx b/document/横山台こども園様_帳票テンプレート(Excel作成分)/出欠集計表.xlsx index e61314b..e6ac0f7 100644 Binary files a/document/横山台こども園様_帳票テンプレート(Excel作成分)/出欠集計表.xlsx and b/document/横山台こども園様_帳票テンプレート(Excel作成分)/出欠集計表.xlsx differ diff --git a/document/横山台こども園様_帳票テンプレート(Excel作成分)/幼児日誌.xlsx b/document/横山台こども園様_帳票テンプレート(Excel作成分)/幼児日誌.xlsx index 92a3740..a5ff1c9 100644 Binary files a/document/横山台こども園様_帳票テンプレート(Excel作成分)/幼児日誌.xlsx and b/document/横山台こども園様_帳票テンプレート(Excel作成分)/幼児日誌.xlsx differ diff --git a/src/lib/FileSaver.min.js b/src/0,1歳用日誌/FileSaver.min.js similarity index 100% rename from src/lib/FileSaver.min.js rename to src/0,1歳用日誌/FileSaver.min.js diff --git a/src/lib/KintoneRestAPIClient.min.js b/src/0,1歳用日誌/KintoneRestAPIClient.min.js similarity index 100% rename from src/lib/KintoneRestAPIClient.min.js rename to src/0,1歳用日誌/KintoneRestAPIClient.min.js diff --git a/src/lib/exceljs.min.js b/src/0,1歳用日誌/exceljs.min.js similarity index 100% rename from src/lib/exceljs.min.js rename to src/0,1歳用日誌/exceljs.min.js diff --git a/src/lib/kuc.min.js b/src/0,1歳用日誌/kuc.min.js similarity index 100% rename from src/lib/kuc.min.js rename to src/0,1歳用日誌/kuc.min.js diff --git a/src/0,1歳用日誌/main.js b/src/0,1歳用日誌/main.js index b35e726..3bf1e4a 100644 --- a/src/0,1歳用日誌/main.js +++ b/src/0,1歳用日誌/main.js @@ -2,14 +2,13 @@ "use strict"; const APP_ENV = env["0,1歳日誌出力用"]; - kintone.events.on("app.record.index.show", (event) => { - const headerSpace = getHeaderSpace('single-label-line'); + addApproveFlowAction(); + + kintone.events.on("app.record.detail.show", (event) => { + const headerSpace = getHeaderSpace('', true); const elements = createBtnGroupArea('extract-action-area', '日誌作成', handleButtonClick, { btnElId: 'extract-btn', - yearElId: 'extract-year', - monthElId: 'extract-month', - classElId: 'extract-classroom', }) if (!elements) { @@ -19,9 +18,104 @@ headerSpace.appendChild(elements['extract-action-area']); }); - function handleButtonClick(e, { year, month, className }) { - const fileName = getExcelName(APP_ENV, year + month + '_' + className + '組'); - console.log(fileName); + async function handleButtonClick(e) { + loading(true, '帳票出力中...'); + showError(false); + const api = new KintoneRestAPIClient(); + // 本アプリからデータを読み取る + const record = kintone.app.record.get().record; + if (!record) { + // エラー + loading(false); + return e; + } + + const yearStr = record['年'].value; + const monthInput = record['月'].value; + if (!yearStr || !monthInput) { + showError('年/月が設定されていません'); + loading(false); + return e; + } + const monthStr = String(monthInput).padStart(2, '0'); + + const className = record['クラス'].value; + if (!className) { + showError('クラスが設定されていません'); + loading(false); + return e; + } + + const excelName = APP_ENV.excelName; + await createExcelAndDownload({ + api, + excelName, + exportName: getExcelName(excelName, yearStr + monthStr + '_' + className + '組'), + bizLogic: writeExcel(record, className, getJapaneseEraDate(new Date(yearStr, monthInput - 1, 1))), + }); + loading(false); } + + function writeExcel(record, className, { era, year, month }) { + return async (api, worksheet) => { + const baseCells = findCellsInfo(worksheet, ['園長', '出欠', '食事量', '睡眠時間', '1', '11', '21']); + fillApproveArea(baseCells, worksheet, record); + + const totalPages = baseCells['出欠'].length; + for (let i = 0; i < totalPages; i++) { + updateCell(worksheet, { base: baseCells['出欠'][i], up: 1 }, era + ' ' + year + '年 ' + month + '月'); + updateCell(worksheet, { base: baseCells['食事量'][i], up: 1 }, 'クラス ' + className); + updateCell(worksheet, { base: baseCells['睡眠時間'][i], up: 1 }, '園児名 ' + record['園児名'].value); + } + + fillMainPage(baseCells, worksheet) + } + + function fillMainPage(baseCells, worksheet) { + const records = record['帳票出力用_テーブル'].value.map((e) => e.value); + const inputMergedObject = getMergedInfo(worksheet, baseCells['1'][0]); + const inputMergedRowCnt = inputMergedObject.bottom - inputMergedObject.top + 1; + + [[baseCells['1'][0], 1, 10], [baseCells['11'][0], 11, 10], [baseCells['21'][0], 21, 11]].forEach((obj) => { + const baseForDetail = obj[0]; + const from = obj[1]; + const count = obj[2]; + const cols = getLabelColsMapping(worksheet, baseForDetail.row - 1, ['日付', '出欠', '降園', '体温', '食事量', '排便', '睡眠時間', '保護者から', '園での様子_伝達事項', '評価反省']); + + let currentRow = baseForDetail.row; + for (let i = 0; i < count; i++) { + const index = from + i - 1; + const record = records[index]; + if (!record) { + break; + } + const row = worksheet.getRow(currentRow); + cols.forEach(col => { + const base = { row: currentRow, col: col.index }; + if (col.field === '体温') { + for (let j = 0; j < 3; j++) { + const val1 = record["検温時刻" + (j + 1)].value || ' : '; + const val2 = (record["体温" + (j + 1)].value || ' . ').padStart(4, ' '); + updateCell(worksheet, { base, down: j }, val1 + ' , ' + val2 + ' ℃'); + } + } else if (col.field === '睡眠時間') { + for (let j = 0; j < 2; j++) { + const val1 = record["睡眠開始時間" + (j + 1)].value || ':  '; + const val2 = record["睡眠終了時間" + (j + 1)].value || '  :'; + updateCell(worksheet, { base, down: j }, val1 + ' ~ ' + val2); + } + } else { + updateCell(row, { base }, record[col.field].value); + } + }); + currentRow += inputMergedRowCnt; + } + worksheet.getRow(currentRow - 1).addPageBreak(); + }); + + + } + + } })(); \ No newline at end of file diff --git a/src/0,1歳用日誌/main.mobile.js b/src/0,1歳用日誌/main.mobile.js new file mode 100644 index 0000000..c7df799 --- /dev/null +++ b/src/0,1歳用日誌/main.mobile.js @@ -0,0 +1,6 @@ +(function () { + "use strict"; + + addApproveFlowAction(true); + +})(); \ No newline at end of file diff --git a/src/0,1歳用日誌/pvc.lib.exceljsUtil.js b/src/0,1歳用日誌/pvc.lib.exceljsUtil.js new file mode 100644 index 0000000..6a0234c --- /dev/null +++ b/src/0,1歳用日誌/pvc.lib.exceljsUtil.js @@ -0,0 +1,496 @@ +/** @copyright 2018 Planning Village Corporation Co., Ltd. */ +(function () { + 'use strict'; + + // [IE11] Polyfill of Object.values + if (!Object.values) { + const ownKeys = ( + (typeof Reflect === 'object' && typeof Reflect.ownKeys === 'function') ? Reflect.ownKeys : + // @ts-ignore + (typeof Object.getOwnPropertySymbols === 'function') ? (function (O) { + // @ts-ignore + return Object.getOwnPropertyNames(O).concat(Object.getOwnPropertySymbols(O)); + }) : + Object.getOwnPropertyNames); + // @ts-ignore + const reduce = Function.bind.call(Function.call, Array.prototype.reduce); + // @ts-ignore + const isEnumerable = Function.bind.call(Function.call, Object.prototype.propertyIsEnumerable); + // @ts-ignore + const concat = Function.bind.call(Function.call, Array.prototype.concat); + //@ts-ignore + Object.values = function values(O) { + //@ts-ignore + return reduce(ownKeys(O), function (v, k) { + return concat(v, typeof k === 'string' && isEnumerable(O, k) ? [O[k]] : []) + }, []) + }; + } + + // [IE11] Polyfill of Number.isNaN + if (!Number.isNaN) { + Number.isNaN = function (value) { + return value !== null && (value != value || +value != value); + }; + } + + // [IE11] Polyfill of String.prototype.startsWith + if (!String.prototype.startsWith) { + Object.defineProperty(String.prototype, 'startsWith', { + //@ts-ignore + value: function (search, rawPos) { + var pos = rawPos > 0 ? rawPos | 0 : 0; + return this.substring(pos, pos + search.length) === search; + } + }); + } + + // [IE11] Polyfill of String.prototype.includes + if (!String.prototype.includes) { + String.prototype.includes = function (search, start) { + 'use strict'; + //@ts-ignore + if (search instanceof RegExp) { + throw TypeError('first argument must not be a RegExp'); + } + if (start === undefined) { + start = 0; + } + return this.indexOf(search, start) !== -1; + }; + } + + // [IE11] Polyfill of Array.prototype.findIndex + if (!Array.prototype.findIndex) { + // @ts-ignore + Array.prototype.findIndex = function (predicate) { + if (this === null) { + throw new TypeError('Array.prototype.findIndex called on null or undefined'); + } + if (typeof predicate !== 'function') { + throw new TypeError('predicate must be a function'); + } + var list = Object(this); + var length = list.length >>> 0; + var thisArg = arguments[1]; + var value; + + for (var i = 0; i < length; i++) { + value = list[i]; + if (predicate.call(thisArg, value, i, list)) { + return i; + } + } + return -1; + }; + } + + //@ts-ignore + window.pvc = window.pvc || {}; + //@ts-ignore + window.pvc.lib = window.pvc.lib || {}; + //@ts-ignore + window.pvc.lib.exceljsUtil = (function () { + const exceljs = { + /** + * ワークブックの blob を読み取ります。 + * @param {Blob} blob Blob + * @return {Promise} ワークブック + */ + loadWorkbookBlob: function (blob) { + return new Promise(function (resolve, reject) { + var reader = new FileReader(); + reader.onload = function (e) { + // @ts-ignore + resolve(e.target.result); + }; + reader.onerror = function (e) { + reject(e); + } + reader.onabort = function (e) { + reject(e); + } + reader.readAsArrayBuffer(blob); + }).then(function (arrayBuffer) { + // 非公式のメンバー load を使用 + // @ts-ignore + return new ExcelJS.Workbook().xlsx.load(arrayBuffer); + }); + }, + + /** + * ワークブックを Blob に変換します。 + * @param {ExcelJS.Workbook} workbook ワークブック + * @return {Promise} Blob + */ + saveWorkbookToBlob: function (workbook) { + // writeBuffer の戻り値 ExcelJS.Buffer はブラウザ環境では Uint8Array となる + return workbook.xlsx.writeBuffer().then(function (ua) { + return new Blob([ua], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' + }); + }); + }, + + /** + * 行をコピーします。 + * @param {ExcelJS.Worksheet} worksheet ワークシート + * @param {number} topRowNumber コピー元の開始行番号(1から開始) + * @param {number} [bottomRowNumber] コピー元の終了行番号(1から開始)。省略時は開始行番号と同じ値となります。 + * @returns {pvc.lib.exceljsUtil.CopiedRowsInfo} 行のコピー情報 + */ + copyRows: function (worksheet, topRowNumber, bottomRowNumber) { + const _bottomRowNumber = (bottomRowNumber == null ? topRowNumber : bottomRowNumber); + + if (topRowNumber < 0 || _bottomRowNumber < topRowNumber) { + throw new Error('コピー元の領域とが不正です。'); + } + + // コピー元の領域の情報を収集 + const rows = []; + for (let r = topRowNumber; r <= _bottomRowNumber; r++) { + const row = worksheet.getRow(r); + const cells = []; + for (let c = 1; c <= worksheet.columnCount; c++) { + const cell = row.getCell(c); + cells.push({ + value: cell.value, + style: cell.style, + }); + } + rows.push({ + cells: cells, + height: row.height, + // 非公式のメンバー style を使用 + // @ts-ignore + style: row.style, + }); + } + + // コピー元の領域の内部に収まるマージを収集 + const merges = deepCopyObject(getWorksheetMerges(worksheet).filter(function (merge) { + return (topRowNumber <= merge.top && merge.bottom <= _bottomRowNumber); + }).map(function (merge) { + return { + top: merge.top - topRowNumber, + right: merge.right, + bottom: merge.bottom - topRowNumber, + left: merge.left, + }; + })); + + return deepCopyObject({ + rows: rows, + merges: merges + }); + }, + + /** + * 指定された開始行を起点に、コピーした行を貼り付けます。 + * コピー元の領域と領域外の両方にまたがるセルのマージは貼り付けされません。 + * コピー先の領域を一部でも含むマージは全て解除されます。 + * @param {ExcelJS.Worksheet} worksheet ワークシート + * @param {number} topRowNumber コピー先の開始行番号(1から開始) + * @param {pvc.lib.exceljsUtil.CopiedRowsInfo} copiedRowsInfo 行のコピー情報 + */ + pasteRows: function (worksheet, topRowNumber, copiedRowsInfo) { + const bottomRowNumber = topRowNumber + copiedRowsInfo.rows.length - 1; + + if (topRowNumber < 0) { + throw new Error('コピー先の領域とが不正です。'); + } + + // コピー先の行のマージを解除(コピー先の領域を一部でも含むマージは全て解除) + getWorksheetMerges(worksheet).filter(function (merge) { + return (topRowNumber <= merge.bottom && merge.top <= bottomRowNumber); + }).forEach(function (merge) { + worksheet.unMergeCells(merge.range); + }); + + // マージをペースト + copiedRowsInfo.merges.forEach(function (mergeInfo) { + worksheet.mergeCells( + topRowNumber + mergeInfo.top, + mergeInfo.left, + topRowNumber + mergeInfo.bottom, + mergeInfo.right); + }); + + // セルをペースト + copiedRowsInfo.rows.forEach(function (rowInfo, i) { + const row = worksheet.getRow(topRowNumber + i); + row.height = rowInfo.height; + // 非公式のメンバー style を使用 + // @ts-ignore + row.style = rowInfo.style; + for (let c = 1; c <= worksheet.columnCount; c++) { + const cell = row.getCell(c); + const cellInfo = rowInfo.cells[c - 1]; + if (cellInfo) { + cell.value = cellInfo.value; + cell.style = cellInfo.style; + } else { + exceljs.clearCell(cell); + } + } + }); + }, + + /** + * 指定された開始行を起点に、コピーした行を挿入します。 + * コピー元の領域と領域外の両方にまたがるセルのマージは貼り付けされません。 + * @param {ExcelJS.Worksheet} worksheet ワークシート + * @param {number} topRowNumber コピー先の開始行番号(1から開始) + * @param {pvc.lib.exceljsUtil.CopiedRowsInfo} copiedRowsInfo 行のコピー情報 + */ + insertRows: function (worksheet, topRowNumber, copiedRowsInfo) { + const bottomRows = ( + topRowNumber <= worksheet.rowCount ? + exceljs.copyRows(worksheet, topRowNumber, worksheet.rowCount) : + null); + exceljs.pasteRows(worksheet, topRowNumber, copiedRowsInfo); + if (bottomRows) { + exceljs.pasteRows(worksheet, topRowNumber + copiedRowsInfo.rows.length, bottomRows); + } + }, + + /** + * 列をコピーします。 + * @param {ExcelJS.Worksheet} worksheet ワークシート + * @param {number | string} leftColumn コピー元の開始列の列番号(1から開始)または列ラベル。終了列の引数を省略して、代わりに "A:B" の形式でコピー元の列の範囲を指定することも可能。 + * @param {number | string} [rightColumn] コピー元の終了列の列番号(1から開始)または列ラベル。省略時は開始列と同じとみなされます(開始列を "A:B" の形式で指定された場合を除く)。 + * @returns {pvc.lib.exceljsUtil.CopiedColumnsInfo} 列のコピー情報 + */ + copyColumns: function (worksheet, leftColumn, rightColumn) { + if (rightColumn == null) { + rightColumn = leftColumn; + if (typeof leftColumn === 'string') { + const sp = leftColumn.split(':'); + if (sp.length === 2) { + leftColumn = sp[0]; + rightColumn = sp[1]; + } + } + } + + const leftColumnNumber = ((typeof leftColumn === 'number') ? leftColumn : exceljs.columnLetterToColumnNumber(leftColumn)); + const rightColumnNumber = ((typeof rightColumn === 'number') ? rightColumn : exceljs.columnLetterToColumnNumber(rightColumn)); + + if (leftColumnNumber < 0 || rightColumnNumber < leftColumnNumber) { + throw new Error('コピー元の領域とが不正です。'); + } + + // コピー元の領域の情報を収集 + const columns = []; + for (let c = leftColumnNumber; c <= rightColumnNumber; c++) { + const column = worksheet.getColumn(c); + const cells = []; + for (let r = 1; r <= worksheet.rowCount; r++) { + const cell = worksheet.getRow(r).getCell(c); + cells.push({ + value: cell.value, + style: cell.style, + }); + } + columns.push({ + cells: cells, + width: column.width, + style: column.style, + }); + } + + // コピー元の領域の内部に収まるマージを収集 + const merges = deepCopyObject(getWorksheetMerges(worksheet).filter(function (merge) { + return (leftColumnNumber <= merge.left && merge.right <= rightColumnNumber); + }).map(function (merge) { + return { + top: merge.top, + right: merge.right - leftColumnNumber, + bottom: merge.bottom, + left: merge.left - leftColumnNumber, + }; + })); + + return { + columns: columns, + merges: merges + }; + }, + + /** + * 指定された開始列を起点に、コピーした列を貼り付けます。 + * コピー元の領域と領域外の両方にまたがるセルのマージは貼り付けされません。 + * コピー先の領域を一部でも含むマージは全て解除されます。 + * @param {ExcelJS.Worksheet} worksheet ワークシート + * @param {number | string} leftColumn コピー先の開始列の列番号(1から開始)または列ラベル + * @param {pvc.lib.exceljsUtil.CopiedColumnsInfo} copiedColumnsInfo 列のコピー情報 + */ + pasteColumns: function (worksheet, leftColumn, copiedColumnsInfo) { + const leftColumnNumber = ((typeof leftColumn === 'number') ? leftColumn : exceljs.columnLetterToColumnNumber(leftColumn)); + const rightColumnNumber = leftColumnNumber + copiedColumnsInfo.columns.length - 1; + + if (leftColumnNumber < 0) { + throw new Error('コピー先の領域とが不正です。'); + } + + // コピー先の列のマージを解除(コピー先の領域を一部でも含むマージは全て解除) + getWorksheetMerges(worksheet).filter(function (merge) { + return (leftColumnNumber <= merge.right && merge.left <= rightColumnNumber); + }).forEach(function (merge) { + worksheet.unMergeCells(merge.range); + }); + + // マージをペースト + copiedColumnsInfo.merges.forEach(function (mergeInfo) { + worksheet.mergeCells( + mergeInfo.top, + leftColumnNumber + mergeInfo.left, + mergeInfo.bottom, + leftColumnNumber + mergeInfo.right); + }); + + // セルをペースト + copiedColumnsInfo.columns.forEach(function (columnInfo, i) { + const column = worksheet.getColumn(leftColumnNumber + i); + column.width = columnInfo.width; + column.style = columnInfo.style; + for (let r = 1; r <= worksheet.rowCount; r++) { + const cell = worksheet.getRow(r).getCell(leftColumnNumber + i); + const cellInfo = columnInfo.cells[r - 1]; + if (cellInfo) { + cell.value = cellInfo.value; + cell.style = cellInfo.style; + } else { + exceljs.clearCell(cell); + } + } + }); + }, + + /** + * 指定された開始列を起点に、コピーした列を挿入します。 + * コピー元の領域と領域外の両方にまたがるセルのマージは貼り付けされません。 + * @param {ExcelJS.Worksheet} worksheet ワークシート + * @param {number | string} leftColumn コピー先の開始列の列番号(1から開始)または列ラベル + * @param {pvc.lib.exceljsUtil.CopiedColumnsInfo} copiedRowsInfo 列のコピー情報 + */ + insertColumns: function (worksheet, leftColumn, copiedRowsInfo) { + const leftColumnNumber = ((typeof leftColumn === 'number') ? leftColumn : exceljs.columnLetterToColumnNumber(leftColumn)); + const rightColumns = ( + leftColumnNumber <= worksheet.columnCount ? + exceljs.copyColumns(worksheet, leftColumnNumber, worksheet.columnCount) : + null); + exceljs.pasteColumns(worksheet, leftColumnNumber, copiedRowsInfo); + if (rightColumns) { + exceljs.pasteColumns(worksheet, leftColumnNumber + copiedRowsInfo.columns.length, rightColumns); + } + }, + + /** + * セルをクリアします。 + * @param {ExcelJS.Cell} cell セル + */ + clearCell: function (cell) { + cell.value = null; + /// @ts-ignore + cell.style = cell._mergeStyle(cell._row.style, cell._column.style, {}); + }, + + /** + * 列ラベルから列番号(1から開始)を取得します。 + * @param {string} columnLetter 列ラベル + * @return {number} 列番号(1から開始) + */ + columnLetterToColumnNumber: function (columnLetter) { + const letter = columnLetter.toUpperCase(); + const l = letter.length; + const charCodeA = 65; + let result = 0; + for (let i = 0, j = l - 1; i < l; i++, j--) { + result += (letter.charCodeAt(j) - charCodeA + 1) * (i === 0 ? 1 : Math.pow(26, i)); + } + return result; + }, + + /** + * 日付のセルの値を作成します。 + * @param {Date} date + * @returns {any} + */ + createDateCellValue: function (date) { + // UTC にしないと正しく Excel に反映されない + return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); + }, + + deepCopyObject: deepCopyObject, + }; + + /** + * ワークシートのマージを取得します。 + * @param {ExcelJS.Worksheet} worksheet ワークシート + */ + function getWorksheetMerges(worksheet) { + // 非公式のメンバー _merges を使用 + // @ts-ignore + const mergesDic = worksheet._merges; + return Object.keys(mergesDic).map(function (address) { + return mergesDic[address]; + }); + } + + /** + * オブジェクのコピーします。ディープコピーとなります。 + * @template T + * @param {T} obj + * @returns {T} + */ + function deepCopyObject(obj) { + return copyObject(obj); + + //@ts-ignore + function copyObject(obj) { + return ( + obj == null ? null : + Array.isArray(obj) ? copyArray(obj) : + isDate(obj) ? copyDate(obj) : + isDic(obj) ? copyDic(obj) : + obj); + } + + //@ts-ignore + function copyArray(array) { + //@ts-ignore + return array.map(function (item) { + return copyObject(item); + }); + } + + //@ts-ignore + function isDate(obj) { + return (obj != null && Object.prototype.toString.call(obj) === '[object Date]'); + } + + //@ts-ignore + function copyDate(date) { + return (isNaN(date) ? null : new Date(date.getTime())); + } + + //@ts-ignore + function isDic(obj) { + return (obj != null && typeof obj === 'object'); + } + + //@ts-ignore + function copyDic(dic) { + let result = {}; + for (let key in dic) { + //@ts-ignore + result[key] = copyObject(dic[key]); + } + return result; + } + } + + return exceljs; + }()); +})(); \ No newline at end of file diff --git a/src/2歳以上日誌/FileSaver.min.js b/src/2歳以上日誌/FileSaver.min.js new file mode 100644 index 0000000..6d493b2 --- /dev/null +++ b/src/2歳以上日誌/FileSaver.min.js @@ -0,0 +1,3 @@ +(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open("","_blank"),g&&(g.document.title=g.document.body.innerText="downloading..."),"string"==typeof b)return c(b,d,e);var h="application/octet-stream"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\/[\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&"undefined"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,"undefined"!=typeof module&&(module.exports=g)}); + +//# sourceMappingURL=FileSaver.min.js.map \ No newline at end of file diff --git a/src/2歳以上日誌/KintoneRestAPIClient.min.js b/src/2歳以上日誌/KintoneRestAPIClient.min.js new file mode 100644 index 0000000..dc9c93d --- /dev/null +++ b/src/2歳以上日誌/KintoneRestAPIClient.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.KintoneRestAPIClient=t():e.KintoneRestAPIClient=t()}(window,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=74)}([function(e,t,r){(function(t){var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof t&&t)||Function("return this")()}).call(this,r(40))},function(e,t,r){var n=r(0),o=r(41),i=r(4),u=r(45),s=r(46),a=r(78),c=o("wks"),f=n.Symbol,l=a?f:f&&f.withoutSetter||u;e.exports=function(e){return i(c,e)||(s&&i(f,e)?c[e]=f[e]:c[e]=l("Symbol."+e)),c[e]}},function(e,t,r){"use strict";var n=r(65),o=Object.prototype.toString;function i(e){return"[object Array]"===o.call(e)}function u(e){return void 0===e}function s(e){return null!==e&&"object"==typeof e}function a(e){return"[object Function]"===o.call(e)}function c(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),i(e))for(var r=0,n=e.length;rh;h++)if((y=f?g(n(b=e[h])[0],b[1]):g(e[h]))&&y instanceof c)return y;return new c(!1)}p=d.call(e)}for(m=p.next;!(b=m.call(p)).done;)if("object"==typeof(y=a(p,g,b.value,f))&&y&&y instanceof c)return y;return new c(!1)}).stop=function(e){return new c(!0,e)}},function(e,t){e.exports=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.injectPlatformDeps=t.platformDeps=void 0,t.platformDeps={readFileFromPath:function(){throw new Error("not implemented")},getRequestToken:function(){throw new Error("not implemented")},buildPlatformDependentConfig:function(){throw new Error("not implemented")},buildHeaders:function(){throw new Error("not implemented")}},t.injectPlatformDeps=function(e){t.platformDeps.readFileFromPath=e.readFileFromPath,t.platformDeps.getRequestToken=e.getRequestToken,t.platformDeps.buildPlatformDependentConfig=e.buildPlatformDependentConfig,t.platformDeps.buildHeaders=e.buildHeaders}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.buildPath=void 0,t.buildPath=function(e){var t=e.endpointName,r=e.guestSpaceId;return"/k"+(void 0!==r?"/guest/"+r:"")+"/v1"+(e.preview?"/preview":"")+"/"+t+".json"}},function(e,t,r){var n={};n[r(1)("toStringTag")]="z",e.exports="[object z]"===String(n)},function(e,t,r){var n=r(0),o=r(5);e.exports=function(e,t){try{o(n,e,t)}catch(r){n[e]=t}return t}},function(e,t,r){var n=r(0),o=r(9),i=n.document,u=o(i)&&o(i.createElement);e.exports=function(e){return u?i.createElement(e):{}}},function(e,t,r){var n=r(42),o=Function.toString;"function"!=typeof n.inspectSource&&(n.inspectSource=function(e){return o.call(e)}),e.exports=n.inspectSource},function(e,t,r){var n=r(41),o=r(45),i=n("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},function(e,t){e.exports={}},function(e,t){var r=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){var n=r(7),o=r(83),i=r(19),u=r(20),s=r(44),a=r(4),c=r(43),f=Object.getOwnPropertyDescriptor;t.f=n?f:function(e,t){if(e=u(e),t=s(t,!0),c)try{return f(e,t)}catch(e){}if(a(e,t))return i(!o.f.call(e,t),e[t])}},function(e,t){e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t,r){var n=r(4),o=r(92),i=r(29),u=r(93),s=i("IE_PROTO"),a=Object.prototype;e.exports=u?Object.getPrototypeOf:function(e){return e=o(e),n(e,s)?e[s]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?a:null}},function(e,t,r){var n,o=r(3),i=r(94),u=r(34),s=r(30),a=r(54),c=r(27),f=r(29),l=f("IE_PROTO"),p=function(){},d=function(e){return"