Comment supprimer une cellule et ressaisir les mêmes détails dans Google Sheets
Je suis actuellement en train de créer un moyen d'automatiser la récupération des données sur le cours de l'action.
au début, je pensais que pour mettre à jour la valeur de la cellule, il me suffisait de rafraîchir l'instruction importxml dans la cellule. J'ai donc utilisé ce code de la fonction de feuille de calcul IMPORTXML () d'actualisation périodique
function RefreshImports() {
var lock = LockService.getScriptLock();
if (!lock.tryLock(5000)) return; // Wait up to 5s for previous refresh to end.
// At this point, we are holding the lock.
var id = "YOUR-SHEET-ID";
var ss = SpreadsheetApp.openById(id);
var sheets = ss.getSheets();
for (var sheetNum=0; sheetNum<sheets.length; sheetNum++) {
var sheet = sheets[sheetNum];
var dataRange = sheet.getDataRange();
var formulas = dataRange.getFormulas();
var tempFormulas = [];
for (var row=0; row<formulas.length; row++) {
for (col=0; col<formulas[0].length; col++) {
// Blank all formulas containing any "import" function
// See https://regex101.com/r/bE7fJ6/2
var re = /.*[^a-z0-9]import(?:xml|data|feed|html|range)\(.*/gi;
if (formulas[row][col].search(re) !== -1 ) {
tempFormulas.push({row:row+1,
col:col+1,
formula:formulas[row][col]});
sheet.getRange(row+1, col+1).setFormula("");
}
}
}
// After a pause, replace the import functions
Utilities.sleep(5000);
for (var i=0; i<tempFormulas.length; i++) {
var cell = tempFormulas[i];
sheet.getRange( cell.row, cell.col ).setFormula(cell.formula)
}
// Done refresh; release the lock.
lock.releaseLock();
}
}
apparemment, il NE met PAS à jour la cellule .. alors j'ai découvert que pour actualiser la cellule, je dois
- supprimer le nom du stock
- ressaisissez le nom du stock
voici une vidéo montrant ce que je voulais dire par là (juste pour que ce soit clair) https://streamable.com/eciks0
comment puis-je automatiser cela, peut-être en utilisant le script de feuille de google?
Merci
EDIT: voici une copie de la fiche google avec laquelle je travaille
https://docs.google.com/spreadsheets/d/1BFz3LHWEw-wT9exJv558mAFOv-fIKPINaplmzRY24kw/edit?usp=sharing
essayez d'en faire une copie.
merci encore pour l'aide
Réponses
D'après votre exemple de vidéo, dans votre situation, j'ai pensé que lorsque les valeurs des cellules "B9" et "B10" sont incluses dans url
et xpath
de la formule =IMPORTXML(url, xpath)
, lorsque la valeur de la cellule "B1" est modifiée, la formule est actualisée. Alors, qu'en est-il de l'exemple de script suivant?
Exemple de script:
Veuillez copier et coller le script suivant dans l'éditeur de script de Google Spreadsheet et exécuter la fonction de myFunction
. Dans cet exemple de script, la valeur de la cellule «B1» est remplacée par newValue
.
function myFunction() {
var newValue = "###"; // Please set the new value.
var sheetName = "Sheet1"; // Please set the sheet name.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
sheet.getRange("B1").setValue(newValue);
}
Si le script ci-dessus n'est pas utile et que vous souhaitez également utiliser votre script dans votre question, vous pouvez utiliser le script suivant. Dans ce cas, veuillez régler
var id = "YOUR-SHEET-ID";
pour votre situation réelle.function myFunction() { var newValue = "###"; // Please set the new value. var sheetName = "Sheet1"; // Please set the sheet name. var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); sheet.getRange("B1").setValue(newValue); RefreshImports(); // <--- Added }
Ou, je pense que vous pourrez peut-être utiliser le script suivant pour actualiser les formules de la feuille.
function myFunction2() { var newValue = "###"; // Please set the new value. var sheetName = "Sheet1"; // Please set the sheet name. var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName); sheet.getRange("B1").setValue(newValue); var formula = "="; var tempFormula = "=sample"; sheet.createTextFinder(`^\\${formula}`).matchFormulaText(true).useRegularExpression(true).replaceAllWith(tempFormula); sheet.createTextFinder(`^\\${tempFormula}`).matchFormulaText(true).useRegularExpression(true).replaceAllWith(formula); }
Les références:
- Fils associés
- Fonctions personnalisées et recalcul
- Fonction MAINTENANT () + Réglage du fuseau horaire (Google Sheets)
Ajoutée:
D'après votre réponse et votre vidéo partagée, qu'en est-il de l'exemple de script suivant? Dans ce cas, en tant que simple script, la cellule est effacée et remet la valeur de acen
.
Exemple de script:
function myFunction() {
var newValue = "acen"; // Please set the new value.
var sheetName = "Sheet1"; // Please set the sheet name.
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
var range = sheet.getRange("B1");
range.clearContent();
SpreadsheetApp.flush();
range.setValue(newValue);
}
GetEmCheckEm et BouncEm
La fonction supérieure vous permet de sélectionner toutes les cellules que vous souhaitez rebondir. Utilisez la touche de contrôle et sélectionnez toutes les cellules, puis exécutez getThem ();
function getThem() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getSheetByName('Sheet1');
const rgl=sh.getActiveRangeList();
let rlA=[];
rgl.getRanges().forEach(function(rg,i){
let h=rg.getHeight();
let w=rg.getWidth();
let row=rg.getRow();
let col=rg.getColumn();
for(let i=0;i<h;i++) {
for(let j=0;j<w;j++) {
rlA.push(sh.getRange(Number(row+i),Number(col+j)).getA1Notation());
}
}
});
PropertiesService.getScriptProperties().setProperty('mystocks',JSON.stringify(rlA));
ss.toast("Process Complete");
}
Une fois que vous les avez, vous pouvez cliquer sur l'écran pour effacer vos sélections. Le run checkThem () et vos sélections devraient réapparaître car ils auraient dû être enregistrés dans PropertiesService.
function checkThem() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
const rangeList=sh.getRangeList(JSON.parse(PropertiesService.getScriptProperties().getProperty('mystocks')));
sh.setActiveRangeList(rangeList);
ss.toast('Process Complete');
}
Vous pouvez maintenant exécuter bounceThem () et les valeurs disparaîtront puis réapparaîtront
function bounceThem() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
const list=sh.getRangeList(JSON.parse(PropertiesService.getScriptProperties().getProperty('mystocks')));
let data=[];
list.getRanges().forEach(r=>{data.push(r.getValue());r.setValue('');});
SpreadsheetApp.flush();
Utilities.sleep(5000);
list.getRanges().forEach((r,i)=>{r.setValue(data[i]);});
SpreadsheetApp.flush();
ss.toast("Process Complete");
}
J'ai trouvé cela plutôt exécuté alors je suis revenu ce matin et je l'ai configuré pour utiliser setValues () au lieu de setValue () et c'est beaucoup plus rapide de faire le rebond maintenant.
function getThem1() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getSheetByName('Sheet1');
const rgl=sh.getActiveRangeList();
console.log(sh.getName());
let rlA=rgl.getRanges().map(function(rg){return rg.getA1Notation();});
PropertiesService.getScriptProperties().setProperty('mystocks1',JSON.stringify(rlA));//Stored as JSON in property service
ss.toast("Process Complete");
}
function checkThem1() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
const rangeList=sh.getRangeList(JSON.parse(PropertiesService.getScriptProperties().getProperty('mystocks1')));
sh.setActiveRangeList(rangeList);
ss.toast('Process Complete');
}
function bounceThem1() {
const ss=SpreadsheetApp.getActive();
const sh=ss.getActiveSheet();
const list=sh.getRangeList(JSON.parse(PropertiesService.getScriptProperties().getProperty('mystocks1')));
let data=[];
list.getRanges().forEach(function(rg){
let sA=rg.getValues();//the stored array
data.push(sA);
let nA=[];//this is the null array to remove data
sA.forEach(function(r,i){
nA[i]=[];
r.forEach(function(c,j){
nA[i][j]='';
});
});
rg.setValues(nA);//removing data
});
SpreadsheetApp.flush();//insure all data is visible on the sheet
Utilities.sleep(5000);//5 second bounce delay
list.getRanges().forEach(function(r,i){r.setValues(data[i]);});//Replacing all data as 2d arrays
SpreadsheetApp.flush();//Making sure data is complete and visible
ss.toast("Process Complete");
}
En fonction du nombre de colonnes que vous avez, j'enregistrerais simplement une macro de l'action (Outils> Macros> Enregistrer une macro) et une fois terminée, suivez les instructions de la réponse publiée dans la question ci-dessous pour automatiser son actualisation à la fréquence souhaitée. courir
Est-il possible d'automatiser les scripts Google Spreadsheets (par exemple sans événement pour les déclencher)?