Cara menghapus sel dan memasukkan kembali detail yang sama di Google Sheets

Jan 12 2021

Saat ini saya sedang membuat cara untuk mengotomatiskan pengambilan data harga saham ..

pada awalnya, saya berpikir bahwa untuk memperbarui nilai sel, saya hanya perlu menyegarkan pernyataan importxml di dalam sel. jadi saya menggunakan kode ini dari fungsi spreadsheet IMPORTXML () refresh berkala

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

rupanya, itu TIDAK memperbarui sel .. jadi saya menemukan bahwa untuk menyegarkan sel, saya perlu

  1. hapus nama sahamnya
  2. masukkan kembali nama sahamnya

berikut adalah video yang menunjukkan apa yang saya maksud dengan itu (hanya untuk memperjelas) https://streamable.com/eciks0

bagaimana saya bisa mengotomatiskan ini, mungkin menggunakan skrip lembar google?

Terima kasih


EDIT: ini adalah salinan dari google sheet yang sedang saya kerjakan

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

coba buat salinannya.

terima kasih sekali lagi atas bantuannya

Jawaban

2 Tanaike Jan 12 2021 at 12:18

Dari video sampel Anda, dalam situasi Anda, saya berpikir bahwa ketika nilai sel "B9" dan "B10" dimasukkan ke dalam urldan xpathdari rumus =IMPORTXML(url, xpath), ketika nilai sel "B1" diubah, rumus disegarkan. Lantas, bagaimana dengan contoh script berikut ini?

Contoh skrip:

Harap salin dan tempel skrip berikut ke editor skrip Google Spreadsheet dan jalankan fungsi myFunction. Dalam contoh skrip ini, nilai sel "B1" diganti dengan 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);
}
  • Jika skrip di atas tidak berguna dan ketika Anda ingin juga menggunakan skrip dalam pertanyaan Anda, Anda dapat menggunakan skrip berikut. Dalam kasus ini, harap tetapkan var id = "YOUR-SHEET-ID";untuk situasi Anda yang sebenarnya.

      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
      }
    
  • Atau, saya pikir Anda mungkin bisa menggunakan skrip berikut untuk menyegarkan rumus di lembar.

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

Referensi:

  • Benang terkait
    • Fungsi Kustom dan Penghitungan Ulang
    • Fungsi SEKARANG () + Mengatur Zona Waktu (Google Sheets)

Ditambahkan:

Dari balasan Anda dan video yang Anda bagikan, bagaimana dengan contoh script berikut? Dalam hal ini, sebagai skrip sederhana, sel dihapus dan diberi nilai acenlagi.

Contoh skrip:

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

Fungsi atas memungkinkan Anda memilih semua sel yang ingin Anda pantulkan. Gunakan tombol kontrol dan pilih semua sel lalu jalankan 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");  
}

Setelah Anda mendapatkannya, Anda dapat mengklik layar untuk menghapus pilihan Anda. Jalankan checkThem () dan pilihan Anda akan muncul kembali karena mereka seharusnya telah disimpan di 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');
}

Sekarang Anda dapat menjalankan bounceThem () dan nilainya akan hilang lalu muncul kembali

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

Saya menemukan ini agak berjalan jadi saya kembali pagi ini dan mengaturnya untuk menggunakan setValues ​​() daripada setValue () dan itu jauh lebih cepat melakukan pentalan sekarang.

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

Bergantung pada berapa banyak kolom yang Anda miliki, saya hanya akan merekam makro tindakan (Alat> Makro> Rekam Makro) dan setelah selesai ikuti instruksi dalam jawaban yang diposting dalam pertanyaan di bawah ini untuk mengotomatiskan penyegarannya sesering Anda menyukainya. untuk berlari

Apakah mungkin untuk mengotomatiskan Google Spreadsheets Scripts (misalnya, tanpa ada kejadian yang memicunya)?