In una cartella di lavoro (da qualcun altro) che ho bisogno di analizzare, usano una formula per costruire una lista di stringhe: 04-09-01
, 04-09-02
, 04-09-03
, ecc, che hanno general
come formato. In una parte del mio codice, dovrò copiare questi valori in un'altra parte. Tuttavia, poiché questi valori sono piuttosto speciali, vengono automaticamente considerati come Date
(mentre chiaramente non sono le date per gli utenti) e trasformati in 09/04/2001
, 09/04/2002
, 09/04/2003
, ecc. Di conseguenza, i valori sono completamente modificati e il calcolo basato su questi valori incollati portano a errori.disattivare la conversione automatica ad oggi
Ecco un codice di prova:
function test() {
Excel.run(function (ctx) {
var r0 = ctx.workbook.worksheets.getItem("Sheet1").getRange("A2:A10");
var r1 = ctx.workbook.worksheets.getItem("Sheet1").getRange("F2:F10");
r0.load(["values"]);
return ctx.sync()
.then(function() { console.log(r0.values.toString()); r1.values = r0.values; })
.then(ctx.sync)
.then(function() { r1.load(["values"]); })
.then(ctx.sync)
.then(function() { console.log(r1.values.toString()); })
});
}
Il risultato nella console mostra i valori sono completamente cambiati:
e in Excel, si vede:
Si noti che Excel i tself NON trasforma sistematicamente questi valori in date. Ad esempio, se valutiamo solo valori, copia 04-09-01
in un'altra cella. Excel solleva un avvertimento e suggerisce di convertirlo in una data, ma gli utenti potrebbe ignorare questo avviso e mantenere 04-09-01
così com'è:
Quindi la mia domanda è: esiste un modo o soluzione per disabilitare questa conversione automatica nell'API JavaScript, così da poter copiare fedelmente i valori?
Edit 1:
ho cercato di usare numberFormat
per mantenere i formati iniziali di un intervallo. Per prima cosa, inserisco A2:A0
come segue con General
come formato.
Poi, eseguire il seguente codice:
function test() {
Excel.run(function (ctx) {
var r0 = ctx.workbook.worksheets.getItem("Sheet1").getRange("A2:A10");
var saveValues, saveNumberFormat;
r0.load(["values", "numberFormat"]);
return ctx.sync().then(function() {
saveNumberFormat = r0.numberFormat;
saveValues = r0.values;
r0.numberFormat = saveNumberFormat;
r0.values = saveValues;
});
});
}
Il risultato si è rivelato essere il seguente, e ha Date
come formato.
Così il ripristino di numberFormat
non aiuta?
Modifica 2: Ho fatto un esempio che copia un intervallo su un altro. Voglio che lo r1
abbia esattamente lo stesso formato numerico e valori come r0
. Ma il risultato mostra che 04-09-01
come general
in r0
produce 04/09/2001
come Date
in r1
. Quindi, in pratica, il problema è lo stesso dell'esempio precedente: numberFormat
non può essere copiato o ripristinato fedelmente.
function test() {
Excel.run(function (ctx) {
var r0 = ctx.workbook.worksheets.getItem("Sheet1").getRange("A2:A10");
var r1 = ctx.workbook.worksheets.getItem("Sheet1").getRange("K2:K10");
r0.load(["values", "numberFormat"]);
return ctx.sync()
.then(function() { r1.numberFormat = r0.numberFormat; })
.then(ctx.sync)
.then(function() { r1.values = r0.values; })
});
}
Si può anche provare il 'CoercionType .Text' mostrato qui https://msdn.microsoft.com/en-us/magazine/jj891051.aspx – Slai