質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

4014閲覧

「Googleスプレッドシート + GASで別シートの変換表に基づいた文字列置換」を複数セル同士で実現したい

tatsu3

総合スコア11

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/10/24 13:46

スプレッドシートの複数のセルにある文字列を、まとめて別シートの変換表に基づき置き換え、すぐ横のセルにまとめて出力する仕組みを作りたいと思います。
https://qiita.com/mkiken/items/926ce3a0293cbcd6c404
この記事を参考にしながら、スプレッドシートに「変換表」というタブ名で
||A|B|
|:--:|--:|
|1|あ|ア|
|2|い|イ|
|3|う|ウ|
|4|え|エ|
|5|お|オ|

というシートを作り、もうひとつ「変換前後」というタブ名で、
||A|B|
|:--:|--:|
|1|う||
|2|お||
|3|え||
|4|あ||
|5|い||

というシートを作りました。

JS

1spreadsheet = null; 2sheetMap = []; 3function translate(){ 4 var sheet = _getSheetByName('変換前後'); 5 var rangeFrom = sheet.getRange(1,1,5,1); 6 7 var sheetTable = _getSheetByName("変換表"); 8 // 変換表を全て取得 9 var tableValues = sheetTable.getRange(2,1,sheetTable.getLastRow(),2).getValues(); 10 11 var fromStr = rangeFrom.getValues().join();  //joinで文字列化 12 13 //split-joinで照合する処理 14 for (var i in tableValues) { 15 fromStr = fromStr.split(tableValues[i][0]).join(tableValues[i][1]); 16   } 17 //Logger.log(fromStr); //オ,ウ,キ,エ,ク 18 //配列化する 19   fromStr = fromStr.split(','); //splitで配列化 20   Logger.log(fromStr); // [オ, ウ, キ, エ, ク] 21 22 var rengeTo = sheet.getRange(1,2,5,1); 23 rengeTo.setValue(fromStr) 24} 25 26//第2関数 27function _getSpreadSheet(){ 28 if ( ! spreadsheet) { 29 spreadsheet = SpreadsheetApp.getActive(); 30 } 31 32 return spreadsheet; 33} 34 35//第3関数 36function _getSheetByName(name){ 37 if ( ! sheetMap[name]) { 38 sheetMap[name] = _getSpreadSheet().getSheetByName(name); 39 } 40 41 return sheetMap[name]; 42} 43

これで試したところ、「変換前後」シートのB1-B5のレンジに「fromStr」の先頭の「オ」の文字列が全てのセルに入ってしまいます。
B1-B5の縦の列のセルひとつ一つに、配列「fromStr」の一つ一つのデータが入ることが理想です。
ご教唆頂ければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

最終行が問題です。

rengeTo.setValue(fromStr)

setValueは単一セルに値を入れるものなので、setValuesを使用します。
また、setValuesの引数には行×列の二次元配列にする必要があるので、fromStrを行列に変換する必要があります。

fromStr = fromStr .reduce(function(acc, cur) { acc.push([cur]); return acc; },[]); rangeTo.setValues(fromStr);

投稿2019/10/25 00:12

macaron_xxx

総合スコア3191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu3

2019/10/25 03:44

どうもありがとうございました。実現できました。setValue「s」にしても、そのままではエラーが出て、まさに多次元列化を試してみようとしましたが、その方法が分かりませんでした。reduce()を使う方法は全く思いつきませんでした。道が開けました。迅速なご回答、心より感謝申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問