Bir hücre nasıl silinir ve aynı ayrıntılar Google E-Tablolar'da nasıl yeniden girilir?

Jan 12 2021

Şu anda hisse senedi fiyatının veri alımını otomatikleştirmek için bir yol yapıyorum ..

ilk önce hücrenin değerini güncellemek için hücredeki importxml ifadesini yenilemem gerektiğini düşündüm. bu yüzden bu kodu IMPORTXML () elektronik tablo fonksiyonunu Periyodik olarak yenile

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

görünüşe göre, hücreyi GÜNCELLEMEZ .. bu yüzden hücreyi yenilemek için ihtiyacım olduğunu keşfettim

  1. hisse senedinin adını sil
  2. hisse senedinin adını yeniden girin

işte bununla ne demek istediğimi gösteren bir video (sadece açıklığa kavuşturmak için) https://streamable.com/eciks0

bunu nasıl otomatikleştirebilirim, belki google sayfa komut dosyasını kullanarak?

teşekkür ederim


DÜZENLEME: işte birlikte çalıştığım google sayfasının bir kopyası

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

lütfen bir kopyasını almayı deneyin.

yardım için tekrar teşekkürler

Yanıtlar

2 Tanaike Jan 12 2021 at 12:18

Örnek videonuzdan sizin durumunuzda, "B9" ve "B10" hücrelerinin değerleri formülün urlve "B1" hücresinin değeri değiştirildiğinde formülün yenileneceğini düşündüm. Peki, aşağıdaki örnek komut dosyasına ne dersiniz?xpath=IMPORTXML(url, xpath)

Örnek komut dosyası:

Lütfen aşağıdaki komut dosyasını Google E-Tablo'nun komut dosyası düzenleyicisine kopyalayıp yapıştırın ve işlevini çalıştırın myFunction. Bu örnek komut dosyasında, "B1" hücresinin değerinin üzerine yazılmıştır 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);
}
  • Yukarıdaki komut dosyası kullanışlı değilse ve sorunuzda komut dosyanızı da kullanmak istediğinizde aşağıdaki komut dosyasını kullanabilirsiniz. Bu durumda, lütfen var id = "YOUR-SHEET-ID";gerçek durumunuza göre ayarlayın.

      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
      }
    
  • Veya sayfadaki formülleri yenilemek için aşağıdaki komut dosyasını kullanabileceğinizi düşünüyorum.

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

Referanslar:

  • İlgili konular
    • Özel İşlevler ve Yeniden Hesaplama
    • İşlev ŞİMDİ () + Saat Dilimini Ayarlama (Google E-Tablolar)

Katma:

Yanıtınızdan ve paylaştığınız videodan, aşağıdaki örnek komut dosyasına ne dersiniz? Bu durumda basit bir betik olarak hücre temizlenir ve değerini acenyeniden koyar .

Örnek komut dosyası:

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

Üst işlev, geri döndürmek istediğiniz tüm hücreleri seçmenize olanak tanır. Kontrol tuşunu kullanın ve tüm hücreleri seçin ve ardından getThem () komutunu çalıştırın;

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

Bunları aldıktan sonra, seçimlerinizi temizlemek için ekrana tıklayabilirsiniz. Run checkThem () ve seçimleriniz yeniden görünmelidir çünkü PropertiesService'e kaydedilmiş olmaları gerekir.

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

Artık bounceThem () çalıştırabilirsiniz ve değerler kaybolacak ve sonra yeniden görünecektir.

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

Bunu daha çok çalıştırmayı buldum, bu yüzden bu sabah geri geldim ve setValue () yerine setValues ​​() kullanacak şekilde ayarladım ve şimdi sıçrama yapmak çok daha hızlı.

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

Kaç tane sütuna sahip olduğunuza bağlı olarak, sadece eylemin bir makrosunu kaydederdim (Araçlar> Makrolar> Makro Kaydet) ve tamamlandıktan sonra, yenilemeyi istediğiniz sıklıkta otomatikleştirmek için aşağıdaki soruda yayınlanan cevaptaki talimatları izleyin koşmak

Google E-Tablolar Komut Dosyalarını otomatikleştirmek mümkün mü (örneğin, onları tetikleyecek bir olay olmadan)?