我正在創建一個打算接收 CSV 匯入的 Google 作業表。我已經為每個單元格(日期、數字、文本等)手動創建了數字格式,我希望匯入尊重該格式。目前,情況并非如此。這是我的作業流程:
- 選擇單元格 A1
- 檔案 > 匯入 > 選擇 CSV 檔案
- 將匯入位置設定為“替換所選單元格的資料”
- 禁用“將文本轉換為數字、日期和公式”
- 點擊“匯入資料”
所有資料都以數字格式設定為“自動”并顯示為文本。
附加評論:
- 在第 3 步中,我也嘗試過“替換當前作業表”,但這也不起作用
- 在第 4 步中,如果我不選擇禁用此復選框,我將丟失其中一列的前導零,這是不可接受的
uj5u.com熱心網友回復:
我相信你現在的情況和你的目標如下。
- 您在 Google 電子表格上有一張表格。作業表的單元格具有您手動設定的數字格式。
- 您想將 CSV 資料放在此作業表上。
- 將 CSV 資料放入作業表時,您希望保留手動設定的單元格數字格式。
我和你的情況有同樣的問題。在這種情況下,當使用默認 UI 手動放置 CSV 資料時,似乎無法保留所有單元格的數字格式。所以,當時,我使用了一種解決方法。此解決方法使用 Google Apps 腳本。運行 Google Apps 腳本時,會打開一個對話框。并且,加載 CSV 檔案,然后將 CSV 資料放入活動單元格并保留數字格式。
當這個變通辦法反映在 Google Apps 腳本中時,它變成如下。
示例腳本:
請將以下腳本復制粘貼到谷歌電子表格的腳本編輯器中,并保存腳本。并且,請onOpen使用腳本編輯器運行。這樣就創建了自定義選單。此后,當您選擇一個單元格并從run自定義選單運行腳本時,將打開該對話框。并且,當您選擇 CSV 檔案時,將從活動單元格中檢索并放置 CSV 資料。那時,CSV 資料被放置,而單元格的數字格式被保留。
function onOpen() {
SpreadsheetApp.getUi().createMenu("sample").addItem("run", "insertCSVdata").addToUi();
}
function insertCSVdata(e) {
if (!e) {
const html = HtmlService.createHtmlOutput(`<input type="file" id="csv" value="Select CSV file" accept=".csv,text/csv" onchange="main()"><script>function main(){const file=document.getElementById("csv").files[0]; const fr=new FileReader(); fr.readAsArrayBuffer(file); fr.onload=(f)=> google.script.run.withSuccessHandler(google.script.host.close).insertCSVdata([[...new Int8Array(f.target.result)], file.name, file.type]);}</script>`);
SpreadsheetApp.getUi().showModalDialog(html, "sample");
return;
}
const activeRange = SpreadsheetApp.getActiveRange();
const csv = Utilities.newBlob(...e).getDataAsString();
const ar = Utilities.parseCsv(csv);
const range = activeRange.offset(0, 0, ar.length, ar[0].length);
const formats = range.getNumberFormats().map(r => r.map(c => c || "@"));
range.setValues(ar).setNumberFormats(formats);
return;
}
- 在此示例腳本中,復制單元格的數字格式并將 CSV 資料放入單元格,然后粘貼復制的數字格式。通過該流程,保持單元格的編號格式。
筆記:
在這個示例腳本中,HTML 和 Javascript 如下。
<input type="file" id="csv" value="Select CSV file" accept=".csv,text/csv" onchange="main()"> <script> function main() { const file = document.getElementById("csv").files[0]; const fr = new FileReader(); fr.readAsArrayBuffer(file); fr.onload = (f) => google.script.run.withSuccessHandler(google.script.host.close).insertCSVdata([[...new Int8Array(f.target.result)], file.name, file.type]); } </script>
參考:
- Google Workspace 檔案中的對話框和邊欄
- getNumberFormats()
- setNumberFormats(numberFormats)
uj5u.com熱心網友回復:
不要禁用日期和數字的轉換,除非您告訴它,否則它無法將字串格式化為日期。
uj5u.com熱心網友回復:
這使用隱藏的作業表來保留任何作業表格式。隱藏的作業表是通過從選單中選擇“格式 -> 鎖定格式”來創建的。無論何時更改作業表,隱藏作業表中的格式都將重新應用。
const FORMAT_SHEET_NAME = 'format-sheet';
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Formats')
.addItem('Lock Formats', 'lockFormats')
.addToUi();
}
function onEdit(event) {
const formatSheet = SpreadsheetApp.getActive().getSheetByName(FORMAT_SHEET_NAME);
if (formatSheet) {
const activeRange = event.source.getActiveRange();
const activeRangeA1Notation = activeRange.getA1Notation();
const activeRangeFormats = activeRange.getNumberFormats();
const formatSheetFormats = formatSheet.getRange(activeRangeA1Notation).getNumberFormats();
if (haveSameFormats(activeRangeFormats, formatSheetFormats) === false) {
activeRange.setNumberFormats(formatSheetFormats);
}
}
}
function haveSameFormats(aFormats=[], bFormats=[]) {
const aFormatsNormalized = aFormats.flat();
const bFormatsNormalized = bFormats.flat()
return aFormatsNormalized.every((item, index) => item === bFormatsNormalized[index]);
}
function lockFormats() {
const spreadsheet = SpreadsheetApp.getActive();
const sheet = spreadsheet.getActiveSheet();
const dataRange = sheet.getDataRange();
const dataRangeA1Notation = dataRange.getA1Notation();
const startRowIndex = dataRange.getRowIndex();
const startColIndex = dataRange.getColumn();
const lastRowIndex = dataRange.getLastRow();
const lastColIndex = dataRange.getLastColumn();
const numberFormats = dataRange.getNumberFormats();
let formatSheet = spreadsheet.getSheetByName(FORMAT_SHEET_NAME);
if (formatSheet) {
spreadsheet.deleteSheet(formatSheet);
}
formatSheet = spreadsheet.insertSheet(FORMAT_SHEET_NAME);
formatSheet.hideSheet();
formatSheet.getRange(dataRangeA1Notation).setValues(numberFormats);
dataRange.copyFormatToRange(
formatSheet,
startColIndex,
lastColIndex,
startRowIndex,
lastRowIndex
);
const protection = formatSheet.protect();
const user = Session.getEffectiveUser();
protection.addEditor(user);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/404516.html
標籤:
