//他のスプレッドシートから特定の列のデータを条件にしたがい抽出 function getSelectedValues() { //初期設定 const SS_ID = '1ZCs6OPN0TFjb9fJ4qYCCqsef1PsRDIAgawBdaUYxbxA';//他のスプレッドシートのID const SHEET_NAME = 'シート1';//他のスプレッドシートの抽出対象シート名 const GET_COLS = [2, 3, 6, 7, 9, 12, 13];//抽出対象列(BCFGLIM列) const KEY_PATTERNS = [ //抽出条件のパターン: 最初の要素は列番号、次からキーワード [ //パターン1 [3, '投手'], //条件1(キーワード1つ) [9, 'A型', 'B型', 'O型', '不明'], //条件2( 〃 4つ) [13, '契約中'] //条件3( 〃 1つ) ], [ //パターン2 [3, '捕手'], [9, 'AB型', 'O型'] //全て一致の列は条件を削除 ] ]; //要素を追加、削除したときのカンマに注意(最後の要素の後のカンマ1つだけは無視される) const SET_ROW = 2;//データの挿入開始行 const SET_COL = 1;//データの挿入開始列 //初期設定はここまで //他のシートからデータを抽出 const otherSheet = SpreadsheetApp.openById(SS_ID).getSheetByName(SHEET_NAME); const values = otherSheet.getDataRange().getValues(); const items = [];//抽出データ格納用 //検索パターンごとに繰り返す for (const pattern of KEY_PATTERNS) { //検索列と検索条件をそれぞれの配列に分ける const colKeys = []; const keys = []; for (const key of pattern) { colKeys.push(key[0]); keys.push(key.slice(1)); } //条件にマッチする行を探索し指定列のデータを抽出 for (const row of values) { let matchCount = 0;//条件にマッチした列の数 //条件の数だけ繰り返す for (const i in colKeys) { let isMatch = false;//条件中のキーワードにマッチしたか //キーワードの数だけ繰り返す for (const word of keys[i]) { if (word == row[colKeys[i] - 1]) { isMatch = true; break; } } if (isMatch) { matchCount++; } } if (matchCount == colKeys.length) { const item = []; for (const col of GET_COLS) { item.push(row[col - 1]); } items.push(item); } } } //抽出データをシートに挿入 const sheet = SpreadsheetApp.getActiveSheet(); if (items.length > 0) { if (sheet.getLastRow() > 0) { sheet.getRange(SET_ROW, SET_COL, sheet.getLastRow(), items[0].length).clearContent(); } sheet.getRange(SET_ROW, SET_COL, items.length, items[0].length).setValues(items); } } newScript(sheet); function replaceValues() { var sheet = SpreadsheetApp.getActiveSheet(); var range = sheet.getDataRange(); var values = range.getValues(); for (var row = 0; row < values.length; row++) { if (values[row][1] == "投手" && values[row][6] == "契約中") { values[row][1] = "ピッチャー"; values[row][6] = "解雇"; } else if (values[row][1] == "捕手" && values[row][6] == "契約中") { values[row][1] = "キャッチャー"; values[row][6] = "解雇"; } } range.setValues(values); }
他人に伝わるよう質問しましょう。
画像を追加しました。
これでどうでしょうか。。
さっぱりです。
この表にある、
C列「投手」→ピッチャーに
文字列を変えたいってことなんですが、、、
GAS ではなくシートを開いてメニューから置換機能を使えばいいのでは?
もともとこのデータも違うスプシからデータを抽出したもので、合わせて文字置換できないかなと...
質問の表現を見る限り、投手をピッチャーに、保守をキャッチャーに、契約中を解雇にそれぞれ置換すれば済む話に見えます。
その三回の置換を自動的に行いたいということですか?
はい、自動的に行いたいです!
https://gas-manual.com/string-search-in-sheets/
これを見てやってください。
タイトルには要件を記載してください。
現在のタイトルは質問タグのみで表現できる内容です。
一応、できたのですが、
function newScript(sheet) {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getDataRange();
var values = range.getValues();
for (var row = 0; row < values.length; row++) {
if (values[row][2] == "投手" && values[row][12] == "契約中") {
values[row][2] = "ピッチャー";
values[row][12] = "解雇";
} else if (values[row][2] == "捕手" && values[row][12] == "契約中") {
values[row][2] = "キャッチャー";
values[row][12] = "解雇";
}
}
range.setValues(values);
}
これをすでに作成したスクリプトの下につけて同時に動かしたいのですがどうすれば良いでしょうか。
抽出スクリプト
//他のスプレッドシートから特定の列のデータを条件にしたがい抽出
function getSelectedValues() {
//初期設定
const SS_ID = '1ZCs6OPN0TFjb9fJ4qYCCqsef1PsRDIAgawBdaUYxbxA';//他のスプレッドシートのID
const SHEET_NAME = 'シート1';//他のスプレッドシートの抽出対象シート名
const GET_COLS = [2, 3, 6, 7, 9, 12, 13];//抽出対象列(BCFGLIM列)
const KEY_PATTERNS = [ //抽出条件のパターン: 最初の要素は列番号、次からキーワード
[ //パターン1
[3, '投手'], //条件1(キーワード1つ)
[9, 'A型', 'B型', 'O型', '不明'], //条件2( 〃 4つ)
[13, '契約中'] //条件3( 〃 1つ)
],
[ //パターン2
[3, '捕手'],
[9, 'AB型', 'O型']
//全て一致の列は条件を削除
]
]; //要素を追加、削除したときのカンマに注意(最後の要素の後のカンマ1つだけは無視される)
const SET_ROW = 2;//データの挿入開始行
const SET_COL = 1;//データの挿入開始列
//初期設定はここまで
//他のシートからデータを抽出
const otherSheet = SpreadsheetApp.openById(SS_ID).getSheetByName(SHEET_NAME);
const values = otherSheet.getDataRange().getValues();
const items = [];//抽出データ格納用
//検索パターンごとに繰り返す
for (const pattern of KEY_PATTERNS) {
//検索列と検索条件をそれぞれの配列に分ける
const colKeys = [];
const keys = [];
for (const key of pattern) {
colKeys.push(key[0]);
keys.push(key.slice(1));
}
//条件にマッチする行を探索し指定列のデータを抽出
for (const row of values) {
let matchCount = 0;//条件にマッチした列の数
//条件の数だけ繰り返す
for (const i in colKeys) {
let isMatch = false;//条件中のキーワードにマッチしたか
//キーワードの数だけ繰り返す
for (const word of keys[i]) {
if (word == row[colKeys[i] - 1]) {
isMatch = true;
break;
}
}
if (isMatch) {
matchCount++;
}
}
if (matchCount == colKeys.length) {
const item = [];
for (const col of GET_COLS) {
item.push(row[col - 1]);
}
items.push(item);
}
}
}
//抽出データをシートに挿入
const sheet = SpreadsheetApp.getActiveSheet();
if (items.length > 0) {
if (sheet.getLastRow() > 0) {
sheet.getRange(SET_ROW, SET_COL, sheet.getLastRow(), items[0].length).clearContent();
}
sheet.getRange(SET_ROW, SET_COL, items.length, items[0].length).setValues(items);
}
質問は編集できますので、制限字数(確か1万字)を超えない範囲なのであれば、本分に追記してください。
コメント欄ではマークダウン機能が使えないですし、他の人の目につきにくいです。
(ついでにタイトルも修正いただけたらと)
ご指摘ありがとうございます、
書き直しました。
あぁ、コードのマークダウンについても伝え忘れていましたね。
https://teratail.com/help#about-markdown
そのまま貼り付けるとインデントも何もないテキストになるので、その辺をうまくやってくれる機能です。
やり方:https://teratail.com/questions/238564
「同時に」だと曖昧な表現で誤解を与えかねません。
片方の処理中にもう片方を行わなければならないのであれば並行処理、そうでないなら「順に」と書くほうが正確に伝わると思います。
おそらく「順に」の意味で書かれたと思うのですが、片方の終了後の部分にもう片方を挿入すれば良いのではないでしょうか。
それができないのであれば、できない理由を説明すると的確な回答が得られるのではないかと思います。
ありがとうございます。
書き直しました。
```言語名
コード
````
マークダウンが正しく使われていないためにコードが見づらいのでちゃんと読んでいませんが、どちらも正常に動いているのであれば、①の終わりに②を追加し、さらにその後に newScript(sheet) で動きそうな気もします。
②は引数の sheet を使わず破棄していますが、そこはそのまま使うのが良いと思います。
newScript(sheet) 、入れたのですが、
ダメでした。。
②は引数の sheet を使わず破棄していますが、そこはそのまま使うのが良い
→こちらはどういうことなのでしょうか。
では新たにもう一つスクリプトを作り、その中から①と②を呼び出してみましょう。
呼び出しに成功したかどうかはログを見て確かめてください。
