Jak usunąć komórkę i ponownie wprowadzić te same dane w Arkuszach Google

Jan 12 2021

Obecnie szukam sposobu na zautomatyzowanie pobierania danych dotyczących ceny akcji.

na początku myślałem, że aby zaktualizować wartość komórki, wystarczy odświeżyć instrukcję importxml w komórce. więc użyłem tego kodu z funkcji arkusza kalkulacyjnego Okresowo odświeżaj IMPORTXML ()

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

najwyraźniej NIE aktualizuje komórki ... więc odkryłem, że aby odświeżyć komórkę, muszę

  1. usuń nazwę akcji
  2. wprowadź ponownie nazwę akcji

tutaj jest film pokazujący, co przez to rozumiem (żeby było jasne) https://streamable.com/eciks0

jak mogę to zautomatyzować, może używając skryptu arkusza Google?

Dziękuję Ci


EDYCJA: tutaj jest kopia arkusza Google, z którym pracuję

https://docs.google.com/spreadsheets/d/1BFz3LHWEw-wT9exJv558mAFOv-fIKPINaplmzRY24kw/edit?usp=sharing

spróbuj wykonać jego kopię.

jeszcze raz dziękuję za pomoc

Odpowiedzi

2 Tanaike Jan 12 2021 at 12:18

Z próbki wideo, w sytuacji, kiedy myślałem, że wartości komórek „B9” i „B10” są włączone urli xpathod wzoru =IMPORTXML(url, xpath), gdy wartość komórki „B1” zmienia się formuła jest odświeżany. A co z następującym przykładowym skryptem?

Przykładowy skrypt:

Skopiuj i wklej następujący skrypt do edytora skryptów arkusza kalkulacyjnego Google i uruchom funkcję myFunction. W tym przykładowym skrypcie wartość komórki „B1” jest zastępowana przez 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);
}
  • Jeśli powyższy skrypt nie jest przydatny i chcesz użyć skryptu również w swoim pytaniu, możesz użyć następującego skryptu. W takim przypadku należy ustawić var id = "YOUR-SHEET-ID";aktualną sytuację.

      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
      }
    
  • Albo myślę, że możesz użyć następującego skryptu do odświeżenia formuł w arkuszu.

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

Bibliografia:

  • Powiązane wątki
    • Funkcje niestandardowe i przeliczanie
    • Funkcja TERAZ () + Ustawianie strefy czasowej (Arkusze Google)

Dodany:

A co z Twoją odpowiedzią i udostępnionym filmem, co powiesz na następujący przykładowy skrypt? W tym przypadku, jako prosty skrypt, komórka jest czyszczona i ponownie umieszczana jest wartość acen.

Przykładowy skrypt:

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 And BouncEm

Górna funkcja pozwala wybrać wszystkie komórki, które chcesz odbijać. Użyj klawisza Ctrl i zaznacz wszystkie komórki, a następnie uruchom 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");  
}

Po ich utworzeniu możesz kliknąć ekran, aby wyczyścić wybór. Uruchomienie checkThem () i wybrane opcje powinny pojawić się ponownie, ponieważ powinny zostać zapisane w usłudze 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');
}

Teraz możesz uruchomić bounceThem (), a wartości znikną, a następnie pojawią się ponownie

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

Okazało się, że to raczej działa, więc wróciłem dziś rano i skonfigurowałem go tak, aby używał setValues ​​() zamiast setValue () i teraz jest znacznie szybsze odbijanie.

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

W zależności od tego, ile masz kolumn, po prostu nagrałbym makro akcji (Narzędzia> Makra> Zarejestruj makro) i po zakończeniu postępuj zgodnie z instrukcjami w odpowiedzi zamieszczonej w poniższym pytaniu, aby zautomatyzować jego odświeżanie, jak często byś tego chciał biegać

Czy można zautomatyzować skrypty arkuszy kalkulacyjnych Google (np. Bez zdarzenia, które je wywoła)?