Comment supprimer une cellule et ressaisir les mêmes détails dans Google Sheets

Jan 12 2021

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

  1. supprimer le nom du stock
  2. 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

2 Tanaike Jan 12 2021 at 12:18

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 urlet xpathde 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);
}
1 Cooper Jan 12 2021 at 15:29

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");
}

WaveChappelle Jan 12 2021 at 12:11

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)?