簡體   English   中英

Google表格:如何在檢測到的新行上自動將單詞插入到單元格中?

[英]Google Sheets: How to automatically insert a word into a cell on a new row detected?

我搜索了高低,但我一直無法找到答案(我確定我沒有正確解釋)

我有一個 Google 表格,其中有多個標簽(標簽),標簽為 TabA、TabB 和 TabC。

在此 Google Sheet 上,我在 Slack 上提交了一個斜杠命令,然后使用應用程序腳本在其中一個選項卡上自動填充一行。

我想要做的只是在每次檢測到新行時將一個名為 TabA 的單詞插入到特定單元格中。 並在 TabB 表等上創建新行時插入一個名為 TabB 的單詞。

我確定我只是打錯了我的問題,這就是為什么我無法找到答案。

我實際上不確定代碼的哪一部分發布到工作表中,我認為是這個嗎?

  if(sheetName) {
    sheetName = sheetName.charAt(0).toUpperCase() + sheetName.slice(1)
  } else {
    sheetName = "Current"
  }

  // Find sheet
  var sheetFlag = false;
  for (var r = 1; r < settings.length; r++) {
    if (settings[r][1] == channelID) {
      var sheetID = settings[r][2];
      var targetChannelID = settings[r][4];
      var title = settings[r][0];
      sheetFlag = true;
      break;
    }
  }

  if (sheetFlag) {
    var sheet = SpreadsheetApp.openById(sheetID).getSheetByName(sheetName);
    if(!sheet) {
      sheet = SpreadsheetApp.openById(sheetID).insertSheet(sheetName);
    }

    var lastRow = sheet.getLastRow();

    var slackDetails = ["", "", text1, "","","","","",realName, new Date(),title,text2];

    // paste the slack details to the sheet
    sheet.getRange(lastRow + 1,1,1,slackDetails.length).setValues([slackDetails]);```
Thank you in advance

如果我理解正確,你想:

  • 跟蹤被添加到每個片,電子表格(新行TabATabBTabC )。
  • 每次檢測到新聞行時,將工作表的名稱寫在每張工作表 D 列的連續行中

正如您在評論中被告知的那樣,Apps 腳本沒有觸發器來跟蹤腳本對電子表格所做的更改。 例如, onEdit觸發器“在用戶更改電子表格中任何單元格的值時自動運行”。

解決方法(基於時間的觸發器和腳本屬性):

此限制的一個可能解決方法是使用基於時間的觸發器,該觸發器將定期觸發函數。 您可以手動或以編程方式通過運行此函數一次來創建此觸發器:

function createTrigger() {
  ScriptApp.newTrigger("trackRows")
  .timeBased()
  .everyMinutes(1)
  .create();
}

這將每分鍾觸發函數trackRows 此函數的目的是跟蹤自上次觸發(在本例中為 1 分鍾前)以來對每個工作表行的更改,如果工作表的內容行比上次執行期間多,則將工作表名稱寫入某個單元格。

為此,您可以使用Properties Service ,它允許您存儲鍵值對並在以后的執行中使用它們。

函數trackRows可能是以下幾行:

function trackRows() {
  var props = PropertiesService.getScriptProperties();
  var ss = SpreadsheetApp.openById("your-spreadsheet-id"); // Please change accordingly
  var sheets = ss.getSheets();
  sheets.forEach(function(sheet) {
    var sheetName = sheet.getName();
    var currentRows = sheet.getLastRow();
    var oldRows = props.getProperty(sheetName);
    if (currentRows > oldRows) {
      var firstRow = 2;
      var column = 4;
      var numRows = sheet.getLastRow() - firstRow + 1;
      var rowIndex = sheet.getRange(firstRow, column, numRows).getValues().filter(function(value) {
        return value[0] !== "";
      }).length;
      var cell = sheet.getRange(rowIndex + firstRow, column);
      cell.setValue(sheetName);
    }
    props.setProperty(sheetName, currentRows);
  });
}

該函數執行以下操作:

  • 檢索存儲在先前執行中的腳本屬性。
  • 獲取電子表格中的所有工作表。
  • 檢查每個工作表中包含內容的最后一行(通過Sheet.getLastRow() ),並將該值與之前存儲在腳本屬性中的值進行比較。
  • 如果當前的最后一行高於存儲在屬性中的行,則將工作表名稱寫在相應的 D 列的第一空行中(從 D2 開始)
  • 將當前最后一行存儲在腳本屬性中。

筆記:

  • 該腳本添加表名稱柱d的第一個空行一次,如果它檢測到添加了新的行。 它沒有考慮自上次執行以來添加了多少行,它只考慮是否添加了行。 不過,這很容易改變,如果這是你想要的。
  • 如果您想從頭開始,刪除所有以前存儲的屬性會很有用。 為此,您可以運行一次此函數:
function deleteProps() {
  var props = PropertiesService.getScriptProperties();
  props.deleteAllProperties();
}

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM